home *** CD-ROM | disk | FTP | other *** search
/ Top 200 Programs / Top 200 Programs.iso / Bob8 / THOMPSON / LIBERTY / PRODUCT / LB14W.EXE / FFORM13.BAS < prev    next >
BASIC Source File  |  1997-03-25  |  80KB  |  2,345 lines

  1.      'Freeform v1.3 for Liberty BASIC
  2.  
  3.     'Copyright 1995, Shoptalk Systems
  4.     'All Rights Reserved
  5.  
  6.     'This program lets you graphically lay out
  7.     'windows and their controls, and then converts
  8.     'this visual layout to Liberty BASIC source code
  9.     'that you can paste into your Liberty BASIC
  10.     'programming session.
  11.  
  12.     'This program REQUIRES either:
  13.     '
  14.     '  Liberty BASIC for Windows v1.2 for Windows for better
  15.     '  Liberty BASIC for OS/2 v0.8 or better
  16.  
  17.     'set up an arrays to hold control specs
  18.  
  19.     dim type$(100)
  20.     dim label$(100)
  21.     dim names$(100)
  22.     dim xOrg(100)
  23.     dim yOrg(100)
  24.     dim width(100)
  25.     dim height(100)
  26.     dim corner$(100)
  27.     dim branchLabel$(100)
  28.     dim segment(100)
  29.     dim handle$(100)
  30.     dim bmpName$(100)
  31.     dim arrayName$(100)
  32.     dim menu$(20)
  33.     dim menuItem$(20, 30)
  34.     dim menuItemLocal$(30)
  35.     dim menuItemCount(20)
  36.     dim winType$(20)
  37.     dim colorType$(20)
  38.     index = 0
  39.     resizeable$ = " combobox textbox listbox graphicbox groupbox statictext windowframe textedit button "   'add more as you go
  40.     newControlNumber = 0  'increment by one each time a new control is added
  41.     qu$ = chr$(34)
  42.     controlsThatBranch$ = " button listbox combobox bmpbutton checkbox radiobutton "
  43.     snapOn = 1
  44.     xInterval = 8
  45.     yInterval = 5
  46.     createInspect = 1
  47.  
  48.     formName$ = "untitled.fre"
  49.     windowXOrigin = 70
  50.     windowYOrigin = 10
  51.     windowXExtent = 550
  52.     windowYExtent = 410
  53.     windowLabel$ = "untitled"
  54.     windowType$ = "graphics"
  55.     winHandle$ = "#main"
  56.     wincolor$ = "white"
  57.     textcolor$ = "black"
  58.     boxcolor$ = "white"
  59.     menuCount = 0
  60.  
  61.     winType$(0) = "window"
  62.     winType$(1) = "window_nf"
  63.     winType$(2) = "dialog"
  64.     winType$(3) = "dialog_nf"
  65.     winType$(4) = "dialog_modal"
  66.     winType$(5) = "dialog_nf_modal"
  67.     winType$(6) = "graphics"
  68.     winType$(7) = "graphics_nsb"
  69.     winType$(8) = "graphics_nsb_nf"
  70.  
  71.     colorType$(1) = "black"
  72.     colorType$(2) = "blue"
  73.     colorType$(3) = "brown"
  74.     colorType$(4) = "cyan"
  75.     colorType$(5) = "darkblue"
  76.     colorType$(6) = "darkcyan"
  77.     colorType$(7) = "darkgray"
  78.     colorType$(8) = "darkgreen"
  79.     colorType$(9) = "darkpink"
  80.     colorType$(10) = "darkred"
  81.     colorType$(11) = "green"
  82.     colorType$(12) = "lightgray"
  83.     colorType$(13) = "palegray"
  84.     colorType$(14) = "pink"
  85.     colorType$(15) = "red"
  86.     colorType$(16) = "white"
  87.     colorType$(17) = "yellow"
  88.  
  89.     gosub [loadIniFile]
  90.  
  91.     if displayFormat = 0 then loadbmp "systemBox", "bmp\systembx.bmp"
  92.     if displayFormat = 1 and left$(windowType$, 6) = "dialog" then loadbmp "systemBox", "bmp\95sysbxd.bmp"
  93.     if displayFormat = 1 and left$(windowType$, 6) <> "dialog" then loadbmp "systemBox", "bmp\95sysbx.bmp"
  94.     if displayFormat = 0 then loadbmp "minBox", "bmp\minbx.bmp" else loadbmp "minBox", "bmp\95minbx.bmp"
  95.     if displayFormat = 0 then loadbmp "maxBox", "bmp\maxbx.bmp" else loadbmp "maxBox", "bmp\95maxbx.bmp"
  96.     loadbmp "closebox", "bmp\95exit.bmp"
  97.     loadbmp "comboButton", "bmp\cmbobttn.bmp"
  98.     loadbmp "radioButton", "bmp\radibttn.bmp"
  99.     loadbmp "checkBox", "bmp\checkbox.bmp"
  100.     loadbmp "scrollUp", "bmp\scrlup.bmp"
  101.     loadbmp "scrollDown", "bmp\scrldown.bmp"
  102.     loadbmp "scrollRight", "bmp\scrlrght.bmp"
  103.     loadbmp "scrollLeft", "bmp\scrlleft.bmp"
  104.  
  105. [setUpWindowAndOpenIt]
  106.  
  107.     nomainwin
  108.  
  109.     menu #form, "&File", "&New", [newFile], "&Open", [openFile], "&Save", [saveFile], |,"Q&uit", [quit]
  110.     menu #form, "&Control", "&Inspect", [inspectControl], "&Delete", [deleteControl], |, "Move to &front", [moveToFront], "Move to &back", [moveToBack]
  111.     menu #form, "&Output", "&Produce Code", [produceCode], "Produce Code + Outline", [produceCodeAndOutline]
  112.     menu #form, "&Window", "&Title", [changeTitle], "T&ype", [changeWindowType], "&Handle", [changeHandle], "&Window Colour", [changeColorType], "&Box Colour", [changeBoxColorType]
  113.     menu #form, "O&ptions", "&Auto Snap to Grid", [gridDialog], "&Settings", [settingsDialog]
  114.     menu #form, "&Menu", "&Add a Menu", [addAMenu], "&Remove a Menu", [removeMenu], "&Edit Menus", [editMenus]
  115.  
  116.     bmpbutton #form, "bmp\loadbttn.bmp", [openFile], UL, 5, 40
  117.     bmpbutton #form, "bmp\savebttn.bmp", [saveFile], UL, 35, 40
  118.     bmpbutton #form, "bmp\textbttn.bmp", [addStaticText], UL, 5, 80
  119.     bmpbutton #form, "bmp\efldbttn.bmp", [addField], UL, 35, 80
  120.     bmpbutton #form, "bmp\bttnbttn.bmp", [addButton], UL, 5, 110
  121.     bmpbutton #form, "bmp\usrdbttn.bmp", [addBmpButton], UL, 35, 110
  122.     bmpbutton #form, "bmp\lboxbttn.bmp", [addListBox], UL, 5, 140
  123.     bmpbutton #form, "bmp\cboxbttn.bmp", [addComboBox], UL, 35, 140
  124.     bmpbutton #form, "bmp\rdiobttn.bmp", [addRadioButton], UL, 5, 170
  125.     bmpbutton #form, "bmp\chbxbttn.bmp", [addCheckBox], UL, 35, 170
  126.     bmpbutton #form, "bmp\gboxbttn.bmp", [addGroupBox], UL, 5, 200
  127.     bmpbutton #form, "bmp\tedtbttn.bmp", [addTextEdit], UL, 35, 200
  128.     bmpbutton #form, "bmp\grbxbttn.bmp", [addGraphicBox], UL, 5, 230
  129.     bmpbutton #form, "bmp\windfill.bmp", [changeBoxColorType], UL, 35, 230
  130.     bmpbutton #form, "bmp\check.bmp", [inspectControl], UL, 5, 270
  131.     bmpbutton #form, "bmp\checkout.bmp", [deleteControl], UL, 35, 270
  132.     bmpbutton #form, "bmp\infront.bmp", [moveToFront], UL, 5, 300
  133.     bmpbutton #form, "bmp\inback.bmp", [moveToBack], UL, 35, 300
  134.     bmpbutton #form, "bmp\compile.bmp", [produceCode], UL, 5, 330
  135.     bmpbutton #form, "bmp\compile2.bmp", [produceCodeAndOutline], UL, 35, 330
  136.  
  137.     open "FreeForm v1.3 for Liberty BASIC" for graphics_fs_nsb as #form
  138.     if Platform$ = "OS/2" then print #form, "font systemmonospaced 8 12";
  139.     if Platform$ = "Windows" and displayFormat = 0 then print #form, "font fixedsys 8 15";
  140.     if Platform$ = "Windows" and displayFormat = 1 then print #form, "font system 7 16";
  141.     print #form, "trapclose [quit]";
  142.  
  143.  
  144. [drawTheWindow]
  145.  
  146.     gosub [renderWindow]
  147.     gosub [addWindowFrame]
  148.  
  149.     goto [setForSelection]
  150.  
  151.  
  152. [addWindowFrame]    'add the window frame as the first object
  153.  
  154.     objectCount = objectCount + 1
  155.     idx = objectCount
  156.     xOrg(idx) = 70
  157.     yOrg(idx) = 10
  158.     width(idx) = 550
  159.     height(idx) = 410
  160.     type$(idx) = "windowframe"
  161.     return
  162.  
  163.  
  164. [addButton]     'add a new button to the form
  165.  
  166.     text$ = ""
  167.     prompt "Please enter text for this button"; text$
  168.     if left$(text$, 1) = qu$ then text$ = mid$(text$, 2)
  169.     if right$(text$, 1) = qu$ then text$ = left$(text$, len(text$) - 1)
  170.     if text$ = "" then [inputLoop]
  171.  
  172.     newControlNumber = newControlNumber + 1
  173.     objectCount = objectCount + 1
  174.     idx = objectCount
  175.     xOrg(idx) = 80
  176.     yOrg(idx) = 40
  177.     label$(idx) = text$
  178.     width(idx) = 8 * (len(label$(idx))) + 10
  179.     height(idx) = 15 + 10
  180.     type$(idx) = "button"
  181.     names$(idx) = "button"+str$(newControlNumber)
  182.     corner$(idx) = "UL"
  183.     branchLabel$(idx) = "["+names$(idx)+"Click]"
  184.     gosub [renderButton]
  185.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  186.     goto [inputLoop]
  187.  
  188.  
  189. [addBmpButton]     'add a new bmpButton to the form
  190.  
  191.     bmp$ = ""
  192.     filedialog "Select a bitmap for this button", "*.bmp", bmp$
  193.     if bmp$ = "" then [inputLoop]
  194.  
  195.     newControlNumber = newControlNumber + 1
  196.     objectCount = objectCount + 1
  197.     idx = objectCount
  198.     xOrg(idx) = 100
  199.     yOrg(idx) = 50
  200.     type$(idx) = "bmpbutton"
  201.     names$(idx) = "bmpbutton"+str$(newControlNumber)
  202.     corner$(idx) = "UL"
  203.     bmpName$(idx) = bmp$
  204.     loadbmp bmp$, bmp$
  205.     branchLabel$(idx) = "["+names$(idx)+"Click]"
  206.     gosub [renderBmpButton]
  207.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  208.     goto [inputLoop]
  209.  
  210.  
  211. [addField]     'add a new field (textBox) to the form
  212.  
  213.     newControlNumber = newControlNumber + 1
  214.     objectCount = objectCount + 1
  215.     idx = objectCount
  216.     xOrg(idx) = 100
  217.     yOrg(idx) = 50
  218.     width(idx) = 100
  219.     height(idx) = 25
  220.     type$(idx) = "textbox"
  221.     names$(idx) = "textbox"+str$(newControlNumber)
  222.     gosub [renderTextBox]
  223.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  224.     goto [inputLoop]
  225.  
  226.  
  227. [addTextEdit]     'add a new field (textBox) to the form
  228.  
  229.     newControlNumber = newControlNumber + 1
  230.     objectCount = objectCount + 1
  231.     idx = objectCount
  232.     xOrg(idx) = 100
  233.     yOrg(idx) = 50
  234.     width(idx) = 100
  235.     height(idx) = 100
  236.     type$(idx) = "textedit"
  237.     names$(idx) = "textedit"+str$(newControlNumber)
  238.     gosub [renderTextEdit]
  239.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  240.     goto [inputLoop]
  241.  
  242.  
  243. [addComboBox]     'add a new combobox to the form
  244.  
  245.     newControlNumber = newControlNumber + 1
  246.     objectCount = objectCount + 1
  247.     idx = objectCount
  248.     xOrg(idx) = 100
  249.     yOrg(idx) = 50
  250.     width(idx) = 100
  251.     height(idx) = 100
  252.     type$(idx) = "combobox"
  253.     names$(idx) = "combobox"+str$(newControlNumber)
  254.     branchLabel$(idx) = "["+names$(idx)+"DoubleClick]"
  255.     arrayName$(idx) = "array$("
  256.     gosub [renderComboBox]
  257.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  258.     goto [inputLoop]
  259.  
  260.  
  261. [addListBox]     'add a new listbox to the form
  262.  
  263.     newControlNumber = newControlNumber + 1
  264.     objectCount = objectCount + 1
  265.     idx = objectCount
  266.     xOrg(idx) = 100
  267.     yOrg(idx) = 50
  268.     width(idx) = 100
  269.     height(idx) = 100
  270.     type$(idx) = "listbox"
  271.     names$(idx) = "listbox"+str$(newControlNumber)
  272.     branchLabel$(idx) = "["+names$(idx)+"DoubleClick]"
  273.     arrayName$(idx) = "array$("
  274.     gosub [renderListBox]
  275.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  276.     goto [inputLoop]
  277.  
  278.  
  279. [addStaticText]     'add statictext to the form
  280.  
  281.     text$ = ""
  282.     prompt "Please enter the text you would like to add:"; text$
  283.     if left$(text$, 1) = qu$ then text$ = mid$(text$, 2)
  284.     if right$(text$, 1) = qu$ then text$ = left$(text$, len(text$) - 1)
  285.     if text$ = "" then [inputLoop]
  286.  
  287.     newControlNumber = newControlNumber + 1
  288.     objectCount = objectCount + 1
  289.     idx = objectCount
  290.     xOrg(idx) = 100
  291.     yOrg(idx) = 50
  292.     label$(idx) = text$
  293.     width(idx) = 8 * len(label$(idx))
  294.     height(idx) = 20
  295.     type$(idx) = "statictext"
  296.     names$(idx) = "statictext"+str$(newControlNumber)
  297.     corner$(idx) = ""
  298.     gosub [renderStaticText]
  299.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  300.     goto [inputLoop]
  301.  
  302.  
  303. [addGroupBox]     'add groupbox to the form
  304.  
  305.     text$ = "No Text"
  306.     prompt "Please enter the text this GroupBox :"; text$
  307.     if left$(text$, 1) = qu$ then text$ = mid$(text$, 2)
  308.     if right$(text$, 1) = qu$ then text$ = left$(text$, len(text$) - 1)
  309.     if text$ = "" then [inputLoop]
  310.     if text$ = "No Text" then text$ = ""
  311.  
  312.     newControlNumber = newControlNumber + 1
  313.     objectCount = objectCount + 1
  314.     idx = objectCount
  315.     xOrg(idx) = 100
  316.     yOrg(idx) = 50
  317.     width(idx) = 100
  318.     height(idx) = 100
  319.     type$(idx) = "groupbox"
  320.     names$(idx) = "groupbox"+str$(newControlNumber)
  321.     corner$(idx) = ""
  322.     label$(idx) = text$
  323.     gosub [renderGroupBox]
  324.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  325.     goto [inputLoop]
  326.  
  327. [addGraphicBox]
  328.  
  329.     if  left$(windowType$, 8) <> "graphics" then notice " Error!" + chr$(13) + "This function is only supported in Graphics" : goto [inputLoop]
  330.     newControlNumber = newControlNumber + 1
  331.     objectCount = objectCount + 1
  332.     idx = objectCount
  333.     xOrg(idx) = 100
  334.     yOrg(idx) = 50
  335.     width(idx) = 100
  336.     height(idx) = 100
  337.     type$(idx) = "graphicbox"
  338.     names$(idx) = "graphicbox"+str$(newControlNumber)
  339.     corner$(idx) = ""
  340.     label$(idx) = ""
  341.     gosub [renderGraphicBox]
  342.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  343.     goto [inputLoop]
  344.  
  345. [addRadioButton]     'add radiobutton to the form
  346.  
  347.     text$ = ""
  348.     prompt "Please enter a label for the radiobutton:"; text$
  349.     if left$(text$, 1) = qu$ then text$ = mid$(text$, 2)
  350.     if right$(text$, 1) = qu$ then text$ = left$(text$, len(text$) - 1)
  351.     if text$ = "" then [inputLoop]
  352.  
  353.     newControlNumber = newControlNumber + 1
  354.     objectCount = objectCount + 1
  355.     idx = objectCount
  356.     xOrg(idx) = 100
  357.     yOrg(idx) = 50
  358.     type$(idx) = "radiobutton"
  359.     names$(idx) = "radiobutton"+str$(newControlNumber)
  360.     corner$(idx) = "UL"
  361.     label$(idx) = text$
  362.     branchLabel$(idx) = "["+names$(idx)+"Set] ["+names$(idx)+"Reset]"
  363.     gosub [renderRadioButton]
  364.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  365.     goto [inputLoop]
  366.  
  367.  
  368. [addCheckBox]     'add checkbox to the form
  369.  
  370.     text$ = ""
  371.     prompt "Please enter a label for the checkbox"; text$
  372.     if left$(text$, 1) = qu$ then text$ = mid$(text$, 2)
  373.     if right$(text$, 1) = qu$ then text$ = left$(text$, len(text$) - 1)
  374.     if text$ = "" then [inputLoop]
  375.  
  376.     newControlNumber = newControlNumber + 1
  377.     objectCount = objectCount + 1
  378.     idx = objectCount
  379.     xOrg(idx) = 100
  380.     yOrg(idx) = 50
  381.     type$(idx) = "checkbox"
  382.     names$(idx) = "checkbox"+str$(newControlNumber)
  383.     corner$(idx) = "UL"
  384.     label$(idx) = text$
  385.     branchLabel$(idx) = "["+names$(idx)+"Set] ["+names$(idx)+"Reset]"
  386.     gosub [renderCheckBox]
  387.     if createInspect then gosub [deselectOnly] : index = idx : gosub [selectDeselect] : goto [inspectControl]
  388.     goto [inputLoop]
  389.  
  390.  
  391. [inputLoop]
  392.  
  393.     scan
  394.     goto [inputLoop]
  395.  
  396.  
  397. [renderWindow]
  398.  
  399.     'render the window depending on the value of windowType$
  400.  
  401.     xOrg = windowXOrigin
  402.     yOrg = windowYOrigin
  403.     xExt = windowXExtent
  404.     yExt = windowYExtent
  405.  
  406.     print #form, "cls";
  407.     print #form, "color black ; down ; size 1";
  408.     print #form, "place "; xOrg + 4; " "; yOrg + 4;
  409.     print #form, "backcolor "; wincolor$;"";
  410.     print #form, "boxfilled "; xOrg + xExt - 4; " "; yOrg + yExt - 4;
  411.     if instr(windowType$, "_nf") > 0 then [noResizingFrame]
  412.  
  413.     'draw resizing frame
  414.     print #form, "color lightgray ; size 3";
  415.     if Platform$ = "OS/2" then print #form, "color yellow";
  416.     if windowType$ = "dialog" then print #form, "color darkgray";
  417.     if windowType$ = "dialog" and Platform$ = "OS/2" then print #form, "color darkcyan";
  418.     print #form, "place "; xOrg + 2; " "; yOrg + 2;
  419.     print #form, "box "; xOrg + xExt - 2; " "; yOrg + yExt - 2;
  420.     print #form, "color black ; backcolor white ; size 1";
  421.     print #form, "place "; xOrg; " "; yOrg;
  422.     print #form, "box "; xOrg + xExt ; " "; yOrg + yExt;
  423.  
  424.   [noResizingFrame]
  425.     'draw titlebar
  426.     print #form, "color black ; backcolor darkblue";
  427.     if left$(windowType$, 6) = "dialog" then print #form, "backcolor darkgray";
  428.     if Platform$ = "OS/2" then print #form, "color darkgray ; backcolor darkcyan";
  429.     print #form, "place "; 4 + xOrg; " "; 4 + yOrg;
  430.     print #form, "boxfilled "; xOrg + xExt - 4; " "; 4 + yOrg + 20;
  431.     if displayFormat = 0 then print #form, "place "; int(xExt/2) + xOrg - len(windowLabel$) * 4; " "; 18 + yOrg;
  432.     if displayFormat = 1 then print #form, "place "; 20 + xOrg ; " "; 18 + yOrg;
  433.     if Platform$ = "OS/2" then print #form, "place "; 48 + xOrg; " "; 18 + yOrg;
  434.     print #form, "color white";
  435.     print #form, "\"; windowLabel$;
  436.  
  437.     'draw buttons
  438.     if Platform$ = "OS/2" then print #form, "drawbmp systemBox "; xOrg + 5; " "; 4 + yOrg;
  439.     if Platform$ = "Windows" then print #form, "drawbmp systemBox "; xOrg + 4; " "; 4 + yOrg;
  440.     print #form, "backcolor white ; color black ; down ; size 1";
  441.     if windowType$ = "dialog" then print #form, "color white" ;
  442.     if windowType$ = "dialog" and Platform$ = "OS/2" then print #form, "color darkgray" ;
  443.     print #form, "place "; xOrg + 4; " "; yOrg + 4;
  444.     print #form, "box "; xOrg + xExt - 4; " "; yOrg + yExt - 4;
  445.     if left$(windowType$, 6) = "dialog" then [drawMenus]
  446.     if displayFormat = 0 and instr(windowType$, "_nf") then print #form, "drawbmp minBox "; xOrg + xExt - 24 - 1; " "; 4 + yOrg; : goto [drawMenus]
  447.     if displayFormat = 1 and instr(windowType$, "_nf") then print #form, "drawbmp closebox "; xOrg + xExt - 24 - 1; " "; 7 + yOrg; : goto [drawMenus]
  448.     if Platform$ = "OS/2" then print #form, "drawbmp minBox "; xOrg + xExt - 43 - 2; " "; 4 + yOrg;
  449.     if Platform$ = "OS/2" then print #form, "drawbmp maxBox "; xOrg + xExt - 24 - 1; " "; 4 + yOrg;
  450.     if Platform$ = "Windows" and displayFormat = 1 then print #form, "drawbmp minBox "; xOrg + xExt - 60; " "; 7 + yOrg;
  451.     if Platform$ = "Windows" and displayFormat = 0 then print #form, "drawbmp minBox "; xOrg + xExt - 43; " "; 4 + yOrg;
  452.     if Platform$ = "Windows" and displayFormat = 1 then print #form, "drawbmp maxBox "; xOrg + xExt - 44; " "; 7 + yOrg;
  453.     if Platform$ = "Windows" and displayFormat = 0 then print #form, "drawbmp maxBox "; xOrg + xExt - 24; " "; 4 + yOrg;
  454.     if Platform$ = "Windows" and displayFormat = 1 then print #form, "drawbmp closebox "; xOrg + xExt - 24; " "; 7 + yOrg;
  455.  
  456.  
  457.   [drawMenus]
  458.     if menuCount = 0 then [dontDrawMenus]
  459.     if displayFormat = 0 then print #form, "color black ; backcolor white" ;
  460.     if displayFormat = 1 then print #form, "color black ; backcolor lightgray" ;
  461.     if Platform$ = "Windows" then print #form, "place "; 4 + xOrg; " "; 23 + yOrg;
  462.     if Platform$ = "OS/2" then print #form, "color darkgray ; place "; 4 + xOrg; " "; 25 + yOrg;
  463.     print #form, "boxfilled "; xOrg + xExt - 4; " "; 24 + yOrg + 20 ;
  464.     string$ = ""
  465.     underline$ = ""
  466.     for x = 0 to menuCount - 1
  467.         item$ = menu$(x)
  468.         hkIndex = instr(menu$(x), "&")
  469.         if hkIndex = 0 then [noHotKey]
  470.         item$ = left$(item$, hkIndex - 1) + mid$(item$, hkIndex + 1)
  471.         underline$ = underline$ + chr$(len(string$)+hkIndex)
  472.       [noHotKey]
  473.         string$ = string$ + item$ + "  "
  474.     next x
  475.     if Platform$ = "OS/2" then print #form, "backcolor palegray" ;
  476.     print #form, "place "; xOrg + 10; " "; 38 + yOrg ;
  477.     print #form, "\"; string$;
  478.     if len(underline$) = 0 then [dontDrawMenus]
  479.     for x = 1 to len(underline$)
  480.         print #form, "place "; xOrg + 10 + (asc(mid$(underline$, x, 1)) - 1) * 8; " "; yOrg + 40 ;
  481.         print #form, "north ; turn 90 ; go 8";
  482.     next x
  483.  
  484.   [dontDrawMenus]
  485.     print #form, "flush" ;
  486.  
  487.     return
  488.  
  489.  
  490.  
  491. [changeTitle]
  492.  
  493.     'change the window's title
  494.     newWindowLabel$ = windowLabel$
  495.     prompt "Specify the window's title"; newWindowLabel$
  496.     if newWindowLabel$ <> "" then windowLabel$ = newWindowLabel$
  497.     gosub [redrawAll]
  498.     goto [inputLoop]
  499.  
  500.  
  501. [changeWindowType]
  502.  
  503.     WindowWidth = 380
  504.     WindowHeight = 200
  505.  
  506.     'change the window's type
  507.     statictext #type.statictext1, "Select the type of window desired:", 14, 11, 272, 20
  508.     combobox #type.types, winType$(, [selectWinType], 22, 36, 256, 115
  509.     button #type, "Accept", [acceptWinType], UL, 302, 36
  510.     button #type, "Cancel", [cancelWinType], UL, 302, 71
  511.     open "Select Window Type" for dialog_modal as #type
  512.     print #type.types, "select "; windowType$ 
  513.     print #type, "trapclose [cancelWinType]"
  514.     defaultType$ = windowType$
  515.  
  516.     goto [inputLoop]
  517.  
  518.  
  519. [selectWinType]   'Perform action for the combobox named 'types'
  520.  
  521.     'select the type of window desired
  522.     print #type.types, "selection?";
  523.     input #type.types, defaultType$
  524.  
  525.     goto [inputLoop]
  526.  
  527.  
  528. [acceptWinType]   'Perform action for the button named 'acceptWinType'
  529.  
  530.     'accept the selected window type
  531.     close #type
  532.     if windowType$ <> defaultType$ then windowType$ = defaultType$
  533.     If left$(windowType$,6) = "dialog" or  left$(windowType$,6) = "window" then wincolor$ = "white"
  534.     if displayFormat = 0 then loadbmp "systemBox", "bmp\systembx.bmp"
  535.     if displayFormat = 1 and left$(windowType$, 6) = "dialog" then loadbmp "systemBox", "bmp\95sysbxd.bmp"
  536.     if displayFormat = 1 and left$(windowType$, 6) <> "dialog" then loadbmp "systemBox", "bmp\95sysbx.bmp"
  537.     gosub [redrawAll]
  538.     goto [inputLoop]
  539.  
  540.  
  541. [cancelWinType]   'Perform action for the button named 'cancelWinType'
  542.  
  543.     'close the window, don't accept type change
  544.     close #type
  545.     goto [inputLoop]
  546.  
  547. [changeColorType]
  548.  
  549.     if  left$(windowType$, 8) <> "graphics" then notice " Error!" + chr$(13) + " Colored windows only supported in Graphics" : goto [inputLoop]
  550.     WindowWidth = 380
  551.     WindowHeight = 200
  552.     'change the window's color type
  553.     statictext #type.statictext1, "Select the window color desired:", 14, 11, 272, 20
  554.     combobox #type.types, colorType$(, [selectColorType], 22, 36, 256, 115
  555.     button #type, "Accept", [acceptColorType], UL, 302, 36
  556.     button #type, "Cancel", [cancelColorType], UL, 302, 71
  557.     open "Select Window Type" for dialog_modal as #type
  558.     print #type.types, "select "; wincolor$ 
  559.     print #type, "trapclose [cancelColorType]"
  560.     colorDefaultType$ = colorType$
  561.  
  562.     goto [inputLoop]
  563.  
  564.  
  565. [selectColorType]   'Perform action for the combobox named 'types'
  566.  
  567.     'select the type of window color desired
  568.     print #type.types, "selection?";
  569.     input #type.types, colorDefaultType$
  570.  
  571.     goto [inputLoop]
  572.  
  573.  
  574. [acceptColorType]   'Perform action for the button named 'acceptColorType'
  575.  
  576.     'accept the selected window type
  577.     close #type
  578.     if colorType$ <> colorDefaultType$ then colorType$ = colorDefaultType$
  579.     wincolor$ = colorType$
  580.     gosub [redrawAll]
  581.     goto [inputLoop]
  582.  
  583.  
  584. [cancelColorType]   'Perform action for the button named 'cancelColorType'
  585.  
  586.     'close the window, don't accept type change
  587.     close #type
  588.     goto [inputLoop]
  589.  
  590. [changeBoxColorType]
  591.  
  592.     if  left$(windowType$, 8) <> "graphics" then notice " Error!" + chr$(13) + " Colored windows only supported in Graphics" : goto [inputLoop]
  593.     WindowWidth = 380
  594.     WindowHeight = 200
  595.     'change the window's color type
  596.     statictext #type.statictext1, "Select the window color desired:", 14, 11, 272, 20
  597.     combobox #type.types, colorType$(, [selectBoxColorType], 22, 36, 256, 115
  598.     button #type, "Accept", [acceptBoxColorType], UL, 302, 36
  599.     button #type, "Cancel", [cancelBoxColorType], UL, 302, 71
  600.     open "Select Window Type" for dialog_modal as #type
  601.     print #type.types, "select "; boxcolor$ 
  602.     print #type, "trapclose [cancelBoxColorType]"
  603.     colorBoxDefaultType$ = colorType$
  604.  
  605.     goto [inputLoop]
  606.  
  607.  
  608. [selectBoxColorType]   'Perform action for the combobox named 'types'
  609.  
  610.     'select the type of window color desired
  611.     print #type.types, "selection?";
  612.     input #type.types, colorBoxDefaultType$
  613.  
  614.     goto [inputLoop]
  615.  
  616.  
  617. [acceptBoxColorType]   'Perform action for the button named 'acceptColorType'
  618.  
  619.     'accept the selected window type
  620.     close #type
  621.     if colorType$ <> colorBoxDefaultType$ then colorType$ = colorBoxDefaultType$
  622.    boxcolor$ = colorType$
  623.     gosub [redrawAll]
  624.     goto [inputLoop]
  625.  
  626.  
  627. [cancelBoxColorType]   'Perform action for the button named 'cancelColorType'
  628.  
  629.     'close the window, don't accept type change
  630.     close #type
  631.     goto [inputLoop]
  632.  
  633. [changeHandle]
  634.  
  635.     'change the window's handle
  636.     prompt "Specify the window's handle (starts with a #)"; result$
  637.     if result$ = "" then [inputLoop]
  638.     winHandle$ = result$
  639.     if left$(winHandle$, 1) <> "#" then winHandle$ = "#" + winHandle$ : notice "Window handle defaults to: " + winHandle$
  640.     goto [inputLoop]
  641.  
  642. [renderButton]
  643.  
  644.     'render the statictext at idx.
  645.     'assume an font 8 bits wide
  646.     type$(idx) = "button"
  647.     xOrgIdx = xOrg(idx)
  648.     yOrgIdx = yOrg(idx)
  649.     print #form, "place "; xOrgIdx; " "; yOrgIdx ;
  650.     print #form, "place "; xOrgIdx; " "; yOrgIdx ;
  651.     print #form, "color black ; backcolor lightgray ; size 1" ;
  652.     print #form, "down ; boxfilled "; xOrgIdx+width(idx); " "; yOrgIdx+height(idx) ;
  653.     print #form, "size 2 ; color darkgray ; place "; xOrgIdx+2; " "; yOrgIdx+2 ;
  654.     print #form, "box "; xOrgIdx+width(idx)-1; " "; yOrgIdx+height(idx)-1 ;
  655.     print #form, "color white" ;
  656.     print #form, "place  "; xOrgIdx+2; " "; yOrgIdx+height(idx)-3 ;
  657.     print #form, "goto "; xOrgIdx+2; " "; yOrgIdx+2 ;
  658.     print #form, "goto "; xOrgIdx+width(idx)-3; " "; yOrgIdx+2 ;
  659.     print #form, "color black ; backcolor lightgray ; size 1" ;
  660.     print #form, "place "; xOrgIdx+int((width(idx)-len(label$(idx))*8)/2); " "; yOrgIdx+int((height(idx)-15)/2)+12 ;
  661.     print #form, "\"; label$(idx);
  662.     gosub [createOrderMarker]
  663.     print #form, orderMarker1$ ;
  664.     print #form, orderMarker2$ ;
  665.     print #form, "up ; flush" ;
  666.     print #form, "segment" : input #form, id
  667.     segment(idx) = id
  668.  
  669.     return
  670.  
  671.  
  672. [renderStaticText]
  673.  
  674.     'render the statictext at idx.
  675.     'assume an font 8 bits wide, 15 high
  676.     type$(idx) = "statictext"
  677.     print #form, "place "; xOrg(idx); " "; yOrg(idx)+15-3 ; " ; place "; xOrg(idx); " "; yOrg(idx)+15-3 ;
  678.     print #form, "down ; color black ; backcolor white";
  679.     if Platform$ = "OS/2" then print #form, "backcolor palegray" ;
  680.     print #form, "\"; label$(idx);
  681.     gosub [createOrderMarker]
  682.     print #form, orderMarker1$ ;
  683.     print #form, orderMarker2$ ;
  684.     print #form, "up ; flush" ;
  685.     print #form, "segment" : input #form, id
  686.     segment(idx) = id
  687.  
  688.     return
  689.  
  690.  
  691. [renderRadioButton]
  692.  
  693.     'render the radiobutton at idx.
  694.     'assume an font 8 bits wide, 15 high
  695.     type$(idx) = "radiobutton"
  696.     width(idx) = 8 * len(label$(idx)) + 16
  697.     height(idx) = 20
  698.     print #form, "down" ;
  699.     print #form, "place "; xOrg(idx); " "; yOrg(idx);
  700.     print #form, "drawbmp radioButton "; xOrg(idx); " "; yOrg(idx);
  701.     print #form, "color black ; backcolor white" ;
  702.     if Platform$ = "OS/2" then print #form, "backcolor palegray" ;
  703.     print #form, "place "; xOrg(idx)+16; " "; yOrg(idx)+15-3 ;
  704.     print #form, "\"; label$(idx);
  705.     gosub [createOrderMarker]
  706.     print #form, orderMarker1$ ;
  707.     print #form, orderMarker2$ ;
  708.     print #form, "up ; flush" ;
  709.     print #form, "segment" : input #form, id
  710.     segment(idx) = id
  711.  
  712.     return
  713.  
  714.  
  715. [renderCheckBox]
  716.  
  717.     'render the checkbox at idx.
  718.     'assume an font 8 bits wide, 15 high
  719.     type$(idx) = "checkbox"
  720.     width(idx) = 8 * len(label$(idx)) + 16
  721.     height(idx) = 20
  722.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  723.     print #form, "down" ;
  724.     print #form, "drawbmp checkBox "; xOrg(idx); " "; yOrg(idx);
  725.     print #form, "color black ; backcolor white" ;
  726.     if Platform$ = "OS/2" then print #form, "backcolor palegray" ;
  727.     print #form, "place "; xOrg(idx)+16; " "; yOrg(idx)+15-3 ;
  728.     print #form, "\"; label$(idx);
  729.     gosub [createOrderMarker]
  730.     print #form, orderMarker1$ ;
  731.     print #form, orderMarker2$ ;
  732.     print #form, "up ; flush" ;
  733.     print #form, "segment" : input #form, id
  734.     segment(idx) = id
  735.  
  736.     return
  737.  
  738.  
  739. [renderBmpButton]
  740.  
  741.     'render the bmpbutton at idx.
  742.     'assume an font 8 bits wide
  743.     type$(idx) = "bmpbutton"
  744.     width(idx) = 20
  745.     height(idx) = 20
  746.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  747.     print #form, "drawbmp "; bmpName$(idx); " "; xOrg(idx); " "; yOrg(idx);
  748.     gosub [createOrderMarker]
  749.     print #form, "down ; "; orderMarker1$ ;
  750.     print #form, orderMarker2$ ;
  751.     print #form, "up ; flush" ;
  752.     print #form, "segment" : input #form, id
  753.     segment(idx) = id
  754.  
  755.     return
  756.  
  757.  
  758. [renderComboBox]
  759.  
  760.     'render the comboBox at idx.
  761.     type$(idx) = "combobox"
  762.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  763.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  764.     print #form, "color black ; backcolor white ; size 1" ;
  765.     print #form, "down ; boxfilled "; xOrg(idx)+width(idx)-24; " "; yOrg(idx)+22 ;
  766.     print #form, "drawbmp comboButton "; xOrg(idx)+width(idx)-16 ; " "; yOrg(idx) ;
  767.     gosub [createOrderMarker]
  768.     print #form, orderMarker1$ ;
  769.     print #form, orderMarker2$ ;
  770.     print #form, "up ; flush" ;
  771.     print #form, "segment" : input #form, id
  772.     segment(idx) = id
  773.  
  774.     return
  775.  
  776. [renderTextBox]
  777.  
  778.     'render the textbox at idx.
  779.     type$(idx) = "textbox"
  780.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ; " ; place "; xOrg(idx); " "; yOrg(idx) ;
  781.     print #form, "color black ; backcolor white ; size 1" ;
  782.     print #form, "down ; boxfilled "; xOrg(idx)+width(idx); " "; yOrg(idx)+height(idx) ;
  783.     gosub [createOrderMarker]
  784.     print #form, orderMarker1$ ;
  785.     print #form, orderMarker2$ ;
  786.     print #form, "up ; flush" ;
  787.     print #form, "segment" : input #form, id
  788.     segment(idx) = id
  789.  
  790.     return
  791.  
  792.  
  793. [renderTextEdit]
  794.  
  795.     'render the textedit at idx.
  796.     type$(idx) = "textedit"
  797.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  798.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  799.     print #form, "color black ; backcolor white ; size 1" ;
  800.     print #form, "down ; boxfilled "; xOrg(idx)+width(idx); " "; yOrg(idx)+height(idx) ;
  801.     print #form, "color black ; backcolor lightgray" ;
  802.     print #form, "place "; xOrg(idx)+width(idx)-17; " "; yOrg(idx);
  803.     print #form, "boxfilled "; xOrg(idx)+width(idx); " "; yOrg(idx)+height(idx)-17 ;
  804.     print #form, "drawbmp scrollUp "; xOrg(idx)+width(idx)-17; " "; yOrg(idx);
  805.     print #form, "drawbmp scrollDown "; xOrg(idx)+width(idx)-17; " "; yOrg(idx)+height(idx)-33;
  806.     print #form, "place "; xOrg(idx); " "; yOrg(idx)+height(idx)-17;
  807.     print #form, "boxfilled "; xOrg(idx)+width(idx); " "; yOrg(idx)+height(idx) ;
  808.     print #form, "drawbmp scrollLeft "; xOrg(idx); " "; yOrg(idx)+height(idx)-17;
  809.     print #form, "drawbmp scrollRight "; xOrg(idx)+width(idx)-33; " "; yOrg(idx)+height(idx)-17;
  810.     gosub [createOrderMarker]
  811.     print #form, orderMarker1$ ;
  812.     print #form, orderMarker2$ ;
  813.     print #form, "up ; flush" ;
  814.     print #form, "segment" : input #form, id
  815.     segment(idx) = id
  816.  
  817.     return
  818.  
  819.  
  820. [renderListBox]
  821.  
  822.     'render the listbox at idx.
  823.     type$(idx) = "listbox"
  824.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  825.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  826.     print #form, "color black ; backcolor white ; size 1" ;
  827.     print #form, "down ; boxfilled "; xOrg(idx)+width(idx); " "; yOrg(idx)+height(idx) ;
  828.     print #form, "color black ; backcolor lightgray" ;
  829.     print #form, "place "; xOrg(idx)+width(idx)-17; " "; yOrg(idx);
  830.     print #form, "boxfilled "; xOrg(idx)+width(idx); " "; yOrg(idx)+height(idx) ;
  831.     print #form, "drawbmp scrollUp "; xOrg(idx)+width(idx)-17; " "; yOrg(idx);
  832.     print #form, "drawbmp scrollDown "; xOrg(idx)+width(idx)-17; " "; yOrg(idx)+height(idx)-17;
  833.     gosub [createOrderMarker]
  834.     print #form, orderMarker1$ ;
  835.     print #form, orderMarker2$ ;
  836.     print #form, "up ; flush" ;
  837.     print #form, "segment" : input #form, id
  838.     segment(idx) = id
  839.  
  840.     return
  841.  
  842.   [renderGraphicBox]
  843.  
  844.     'render the graphicbox at idx.  assume a font 8x15.
  845.     type$(idx) = "graphicbox"
  846.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  847.     print #form, "place "; xOrg(idx)+4 ; " "; yOrg(idx)+8 ;
  848.     print #form, "color black ; backcolor "; boxcolor$ ;"; size 1" ;
  849.     if Platform$ = "OS/2" then print #form, "backcolor palegray" ;
  850.     print #form, "down ; boxfilled "; xOrg(idx)+width(idx)-4; " "; yOrg(idx)+height(idx)-7 ;
  851.    gosub [createOrderMarker]
  852.     print #form, orderMarker1$ ;
  853.     print #form, orderMarker2$ ;
  854.     print #form, "up ; flush" ;
  855.     print #form, "segment" : input #form, id
  856.     segment(idx) = id
  857.     return
  858.  
  859. [renderGroupBox]
  860.  
  861.     'render the groupbox at idx.  assume a font 8x15.
  862.     type$(idx) = "groupbox"
  863.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  864.     print #form, "place "; xOrg(idx)+4 ; " "; yOrg(idx)+8 ;
  865.     print #form, "color black ; backcolor white ; size 1" ;
  866.     if Platform$ = "OS/2" then print #form, "backcolor palegray" ;
  867.     print #form, "down ; boxfilled "; xOrg(idx)+width(idx)-4; " "; yOrg(idx)+height(idx)-7 ;
  868.     print #form, "place "; xOrg(idx)+8; " "; yOrg(idx)+15 ;
  869.     print #form, "\"; label$(idx);
  870.     gosub [createOrderMarker]
  871.     print #form, orderMarker1$ ;
  872.     print #form, orderMarker2$ ;
  873.     print #form, "up ; flush" ;
  874.     print #form, "segment" : input #form, id
  875.     segment(idx) = id
  876.  
  877.     return
  878.  
  879.  
  880. [createOrderMarker]
  881.  
  882.     orderMarker1$ = ""
  883.     orderMarker2$ = ""
  884.     if displayOrdering = 0 then return
  885.     orderMarker1$ = "color white ; backcolor black ; place " + str$(xOrg(idx)-4) + " " + str$(yOrg(idx)+7)
  886.     orderMarker2$ = "\" + str$(idx - 1)
  887.     return
  888.  
  889.  
  890. [inspectControl]
  891.  
  892.     'pop up a dialog for displaying/modifying control
  893.     'properties
  894.  
  895.     if index < 2 then [inputLoop]
  896.  
  897.     if inspectIsOpen = 1 then close #inspect
  898.  
  899.     WindowHeight = 200
  900.     WindowWidth = 472
  901.  
  902.     textbox #inspect.labelField, 140, 15, 220, 25
  903.     textbox #inspect.nameField, 140, 46, 220, 25
  904.     textbox #inspect.branchLabelField, 140, 77, 220, 25
  905.     textbox #inspect.arrayNameField, 140, 108, 220, 25
  906.     statictext #inspect.type, "Label:", 17, 21, 200, 20
  907.     statictext #inspect.type, "Name:", 17, 52, 200, 20
  908.     statictext #inspect.statictext2, "Branch Label(s):", 17, 83, 200, 20
  909.     statictext #inspect.statictext4, "Array:", 17, 113, 114, 20
  910.     button #inspect, "Accept", [acceptInspect], UL, 372, 15
  911.     button #inspect, "Cancel", [cancelInspect], UL, 372, 46
  912.     statictext #inspect.statictext15, "n/a = not", 374, 79, 70, 20
  913.     statictext #inspect.statictext16, "applicable", 374, 95, 70, 20
  914.     open "Modify Control" for dialog_modal as #inspect
  915.     print #inspect, "trapclose [cancelInspect]";
  916.     inspectIsOpen = 1
  917.  
  918.     print #inspect.labelField, label$(index)
  919.     print #inspect.type, type$(index) + " name:"
  920.     print #inspect.nameField, names$(index)
  921.     print #inspect.branchLabelField, branchLabel$(index)
  922.     if instr(" button statictext checkbox radiobutton graphicbox groupbox ", type$(index)) = 0 then print #inspect.labelField, "n/a"
  923.     if instr(controlsThatBranch$, type$(index)) = 0 then print #inspect.branchLabelField, "n/a"
  924.     if instr(" listbox combobox ", type$(index)) > 0 then print #inspect.arrayNameField, arrayName$(index) else print #inspect.arrayNameField, "n/a"
  925.  
  926.     goto [inputLoop]
  927.  
  928.  
  929. [acceptInspect]
  930.  
  931.     'set the properties as modified by the user
  932.     isModified = 1  'the form has been modified
  933.     print #inspect.nameField, "!contents?" : input #inspect.nameField, names$ : names$(index) = names$
  934.     branches = instr(controlsThatBranch$, type$(index))
  935.     if branches > 0 then print #inspect.branchLabelField, "!contents?" : input #inspect.branchLabelField, bLabel$ : branchLabel$(index) = bLabel$
  936.     usesArray = instr(" listbox combobox ", type$(index))
  937.     if usesArray > 0 then print #inspect.arrayNameField, "!contents?" : input #inspect.arrayNameField, aName$ : arrayName$(index) = aName$
  938.     close #inspect
  939.     inspectIsOpen = 0
  940.  
  941.     hasLabel =  instr(" button statictext checkbox radiobutton groupbox graphicbox ", type$(index))
  942.     if hasLabel = 0 then [inputLoop]
  943.  
  944.     print #inspect.labelField, "!contents?"
  945.     input #inspect.labelField, label$
  946.     if label$ <> label$(index) then label$(index) = label$ : gosub [redrawAll]
  947.  
  948.     goto [inputLoop]
  949.  
  950.  
  951. [cancelInspect]
  952.  
  953.     'close the inspector window
  954.     close #inspect
  955.     inspectIsOpen = 0
  956.  
  957.     goto [inputLoop]
  958.  
  959.  
  960. [setForSelection]
  961.  
  962.     'set up event handling for the default behavior (selection)
  963.     print #form, "when leftButtonDown [selectControl]";
  964.     print #form, "when leftButtonDouble [inspectControl]";
  965.     print #form, "when leftButtonMove" ;
  966.     print #form, "when leftButtonUp" ;
  967.  
  968.     goto [inputLoop]
  969.  
  970.  
  971. [selectControl]
  972.  
  973.     'set up event handling
  974.     print #form, "when leftButtonUp [setForSelection]" ;
  975.     print #form, "when leftButtonDown" ;
  976.  
  977.     'highlight the control at the mouse click position
  978.     x = MouseX : y = MouseY
  979.  
  980.     if index = 0 then [dontDeselect]
  981.  
  982.     'check to see if the resize handle has been clicked on, if applicable
  983.     if instr(resizeable$, type$(index)) = 0 then [deselect]
  984.     if x < xOrg(index)+width(index)-3 or x > xOrg(index)+width(index)+3 then [deselect]
  985.     if y < yOrg(index)+height(index)-3 or y > yOrg(index)+height(index)+3 then [deselect]
  986.     goto [resizeControl]
  987.  
  988. [deselect]
  989.     print #form, "delsegment "; selectId -1 ;
  990.     gosub [selectDeselect]
  991.     index = 0
  992.     print #form, "delsegment "; selectId - 1 ;
  993.  
  994. [dontDeselect]
  995.     gosub [determineControl]
  996.     if newIndex = 0 then [setUpMovementEvent]
  997.  
  998.     index = newIndex
  999.     gosub [selectDeselect]
  1000.     lastMouseX = MouseX
  1001.     lastMouseY = MouseY
  1002.  
  1003. [setUpMovementEvent]
  1004.  
  1005.     if type$(newIndex) = "windowframe" then [inputLoop]
  1006.     print #form, "when leftButtonMove [beginObjectMove]" ;
  1007.     goto [inputLoop]
  1008.  
  1009.  
  1010. [determineControl]
  1011.  
  1012.     'based on x/y, determine which control is selected
  1013.     'set newIndex to point to this control, if found
  1014.     'otherwise set newIndex to 0
  1015.  
  1016.     if objectCount = 0 then return
  1017.  
  1018.     newIndex = 0
  1019.     for i = objectCount to 1 step -1
  1020.         if newIndex > 0 then [skipControl]
  1021.         if type$(i) = "" then [skipControl]
  1022.         if x < xOrg(i) or x > xOrg(i)+width(i) then [skipControl]
  1023.         if y < yOrg(i) or y > yOrg(i)+height(i) then [skipControl]
  1024.         newIndex = i
  1025.         i = 1
  1026. [skipControl]
  1027.     next i
  1028.  
  1029.     return
  1030.  
  1031.  
  1032. [selectDeselect]
  1033.  
  1034.     'select or deselect the object at index by drawing handles
  1035.     xOrgIdx = xOrg(index)
  1036.     yOrgIdx = yOrg(index)
  1037.     xow = xOrgIdx+width(index)
  1038.     yoh = yOrgIdx+height(index)
  1039.     print #form, "rule xor ; down";
  1040.     if type$(index) = "windowframe" then [drawSizingHandle]
  1041.     print #form, "color darkgray ; backcolor white" ;
  1042.     print #form, "place "; xOrgIdx-3; " "; yOrgIdx-3 ;
  1043.     print #form, "boxfilled "; xOrgIdx+3; " "; yOrgIdx+3 ;
  1044.     print #form, "place "; xow-3; " "; yOrgIdx-3 ;
  1045.     print #form, "boxfilled "; xow+3; " "; yOrgIdx+3 ;
  1046.     print #form, "place "; xOrgIdx-3; " "; yoh-3 ;
  1047.     print #form, "boxfilled "; xOrgIdx+3; " "; yoh+3 ;
  1048.  
  1049.   [drawSizingHandle]
  1050.     if instr(resizeable$, type$(index)) > 0 then print #form, "backcolor black" ;
  1051.     print #form, "place "; xow-3; " "; yoh-3 ;
  1052.     print #form, "boxfilled "; xow+3; " "; yoh+3 ;
  1053.     print #form, "rule over ; flush" ;
  1054.     print #form, "segment" ;
  1055.     input #form, selectId
  1056.  
  1057.  
  1058.     return
  1059.  
  1060.  
  1061. [deselectOnly]  'if there is a selected control, deselect it
  1062.  
  1063.     if index = 0 then return  'nothing is selected, do nothing
  1064.     print #form, "delsegment "; selectId -1 ;
  1065.     gosub [selectDeselect]
  1066.     index = 0
  1067.     print #form, "delsegment "; selectId - 1 ;
  1068.  
  1069.     return
  1070.  
  1071.  
  1072.  
  1073. [beginObjectMove]
  1074.  
  1075.     'if the mouse has only slightly moved, ignore the event
  1076.     if abs(MouseX - x) < 3 and abs(MouseY - y) < 3 then [inputLoop]
  1077.  
  1078.     'set up to begin moving the selected object
  1079.     print #form, "delsegment "; selectId - 1 ;
  1080.     print #form, "when leftButtonMove [additionalObjectMoves]" ;
  1081.     print #form, "when leftButtonUp [acceptMovement]" ;
  1082.  
  1083.  
  1084. [additionalObjectMoves]
  1085.  
  1086.     'adjust the position of the selected object, then draw an object frame the size of the
  1087.     'selected object at that new position using xor rule.  set event handling to manage
  1088.     'additional movements or termination of this object's movement.
  1089.  
  1090.     gosub [snapMouse]
  1091.     if MouseX = lastMouseX and MouseY = lastMouseY then [inputLoop]
  1092.  
  1093.     gosub [eraseObjectFrame]
  1094.     xOrg(index) = xOrg(index) + (MouseX - lastMouseX)
  1095.     yOrg(index) = yOrg(index) + (MouseY - lastMouseY)
  1096.     gosub [snapXY]
  1097.     lastMouseX = MouseX
  1098.     lastMouseY = MouseY
  1099.  
  1100.     print #form, "color black ; backcolor white ; size 1" ;
  1101.     print #form, "place "; xOrg(index); " "; yOrg(index) ;
  1102.     print #form, "down ; rule xor ; box "; xOrg(index)+width(index); " "; yOrg(index)+height(index) ;
  1103.     print #form, "rule over ; up ; flush" ;
  1104.     print #form, "segment" : input #form, id
  1105.     print #form, "delsegment "; id - 1 ;
  1106.  
  1107.     goto [inputLoop]
  1108.  
  1109.  
  1110. [eraseObjectFrame]
  1111.  
  1112.     'erase the object frame (for movement)
  1113.     print #form, "color black ; backcolor white ; size 1" ;
  1114.     print #form, "place "; xOrg(index); " "; yOrg(index) ;
  1115.     print #form, "down ; rule xor ; box "; xOrg(index)+width(index); " "; yOrg(index)+height(index) ;
  1116.     print #form, "rule over ; up ; flush" ;
  1117.     print #form, "segment" : input #form, id
  1118.     print #form, "delsegment "; id - 1 ;
  1119.  
  1120.     return
  1121.  
  1122.  
  1123. [acceptResizing]
  1124.  
  1125.     if width(index) < 25 then width(index) = 25
  1126.     if type$(index) <> "textbox" and height(index) < 20 then height(index) = 20
  1127.     if type$(index) = "textbox" and height(index) < 25 then height(index) = 25
  1128.  
  1129.     if type$(index) <> "windowframe" then [acceptMovement]
  1130.     if width(index) < 100 then width(index) = 100
  1131.     if height(index) < 50 then height(index) = 50
  1132.     windowXExtent = width(index)
  1133.     windowYExtent = height(index)
  1134.  
  1135.  
  1136. [acceptMovement]
  1137.  
  1138.     'end the movement phase, and redraw all objects
  1139.     print #form, "delsegment "; segment(index) - 1 ;
  1140.     gosub [redrawAll]
  1141.     'index = 0
  1142.     gosub [selectDeselect]
  1143.     firstObjectMove = false
  1144.     goto [setForSelection]
  1145.  
  1146.  
  1147. [resizeControl]
  1148.  
  1149.     'set up to begin resizing the selected object
  1150.     firstObjectMove = true
  1151.     print #form, "delsegment "; selectId - 1 ;
  1152.     print #form, "when leftButtonMove [additionalResizes]" ;
  1153.     print #form, "when leftButtonUp [acceptResizing]" ;
  1154.     gosub [snapMouse]
  1155.     lastMouseX = MouseX
  1156.     lastMouseY = MouseY
  1157.  
  1158. [additionalResizes]
  1159.  
  1160.     'adjust the position of the selected object, then draw an object frame the size of the
  1161.     'selected object at that new position using xor rule.  set event handling to manage
  1162.     'additional movements or termination of this object's movement.
  1163.  
  1164.     if firstObjectMove = false then gosub [eraseObjectFrame]
  1165.  
  1166.     gosub [snapMouse]
  1167.     width(index) = width(index) + (MouseX - lastMouseX)
  1168.     height(index) = height(index) + (MouseY - lastMouseY)
  1169.     gosub [snapWH]
  1170.     lastMouseX = MouseX
  1171.     lastMouseY = MouseY
  1172.  
  1173.     print #form, "color black ; backcolor white ; size 1" ;
  1174.     print #form, "place "; xOrg(index); " "; yOrg(index) ;
  1175.     print #form, "down ; rule xor ; box "; xOrg(index)+width(index); " "; yOrg(index)+height(index) ;
  1176.     print #form, "rule over ; up ; flush" ;
  1177.     print #form, "segment" : input #form, id
  1178.     print #form, "delsegment "; id - 1 ;
  1179.  
  1180.     goto [inputLoop]
  1181.  
  1182.  
  1183. [snapMouse]  'if snapOn is selected, then snap the mouse to grid
  1184.  
  1185.     if snapOn = 0 then return
  1186.  
  1187.     MouseX = int((MouseX + int(xInterval / 2)) / xInterval) * xInterval
  1188.     MouseY = int((MouseY + int(yInterval / 2)) / yInterval) * yInterval
  1189.     return
  1190.  
  1191.  
  1192. [snapWH]  'if snapOn is selected, then snap the width & height to grid
  1193.  
  1194.     if snapOn = 0 then return
  1195.  
  1196.     width(index) = int((width(index) + int(xInterval / 2)) / xInterval) * xInterval
  1197.     height(index) = int((height(index) + int(yInterval / 2)) / yInterval) * yInterval
  1198.     return
  1199.  
  1200.  
  1201. [snapXY]  'if snapOn is selected, then snap the x,y position to grid
  1202.  
  1203.     if snapOn = 0 then return
  1204.  
  1205.     xOrg(index) = int((xOrg(index) + int(xInterval / 2)) / xInterval) * xInterval
  1206.     yOrg(index) = int((yOrg(index) + int(yInterval / 2)) / yInterval) * yInterval
  1207.     return
  1208.  
  1209.  
  1210. [redrawAll]
  1211.  
  1212.     'redraw all controls
  1213.     isModified = 1  'the form has been modified
  1214.     print #form, "cls";
  1215.     index = 0
  1216.     gosub [renderWindow]
  1217.     if objectCount = 0 then return
  1218.     for idx = 1 to objectCount
  1219.         typeIdx$ = type$(idx)
  1220.         if typeIdx$ = "textbox" then gosub [renderTextBox] : goto [redrawNext]
  1221.         if typeIdx$ = "statictext" then gosub [renderStaticText] : goto [redrawNext]
  1222.         if typeIdx$ = "button" then gosub [renderButton] : goto [redrawNext]
  1223.         if typeIdx$ = "combobox" then gosub [renderComboBox] : goto [redrawNext]
  1224.         if typeIdx$ = "listbox" then gosub [renderListBox] : goto [redrawNext]
  1225.         if typeIdx$ = "bmpbutton" then gosub [renderBmpButton] : goto [redrawNext]
  1226.         if typeIdx$ = "radiobutton" then gosub [renderRadioButton] : goto [redrawNext]
  1227.         if typeIdx$ = "checkbox" then gosub [renderCheckBox] : goto [redrawNext]
  1228.         if typeIdx$ = "groupbox" then gosub [renderGroupBox] : goto [redrawNext]
  1229.         if typeIdx$ = "graphicbox" then gosub [renderGraphicBox] : goto [redrawNext]
  1230.         if typeIdx$ = "textedit" then gosub [renderTextEdit]
  1231.       [redrawNext]
  1232.     next idx
  1233.  
  1234.     return
  1235.  
  1236.  
  1237. [moveToBack]
  1238.  
  1239.     'move the selected control to the back (first item drawn)
  1240.     if index < 2 or objectCount < 2 then [inputLoop]
  1241.     if index = 2 then gosub [redrawAll] : goto [inputLoop]
  1242.  
  1243.     tmpType$ = type$(index)
  1244.     tmpLabel$ = label$(index)
  1245.     tmpNames$ = names$(index)
  1246.     tmpXOrigin = xOrg(index)
  1247.     tmpYOrigin = yOrg(index)
  1248.     tmpWidth = width(index)
  1249.     tmpHeight = height(index)
  1250.     tmpCorner$ = corner$(index)
  1251.     tmpBranchLabel$ = branchLabel$(index)
  1252.     tmpSegment = segment(index)
  1253.     tmpHandle$ = handle$(index)
  1254.     tmpBmpName$ = bmpName$(index)
  1255.     tmpArrayName$ = arrayName$(index)
  1256.  
  1257.     for idx = index - 1 to 2 step -1
  1258.         type$(idx+1) = type$(idx)
  1259.         label$(idx+1) = label$(idx)
  1260.         names$(idx+1) = names$(idx)
  1261.         xOrg(idx+1) = xOrg(idx)
  1262.         yOrg(idx+1) = yOrg(idx)
  1263.         width(idx+1) = width(idx)
  1264.         height(idx+1) = height(idx)
  1265.         corner$(idx+1) = corner$(idx)
  1266.         branchLabel$(idx+1) = branchLabel$(idx)
  1267.         segment(idx+1) = segment(idx)
  1268.         handle$(idx+1) = handle$(idx)
  1269.         bmpName$(idx+1) = bmpName$(idx)
  1270.         arrayName$(idx+1) = arrayName$(idx)
  1271.     next idx
  1272.  
  1273.     type$(2) = tmpType$
  1274.     label$(2) = tmpLabel$
  1275.     names$(2) = tmpNames$
  1276.     xOrg(2) = tmpXOrigin
  1277.     yOrg(2) = tmpYOrigin
  1278.     width(2) = tmpWidth
  1279.     height(2) = tmpHeight
  1280.     corner$(2) = tmpCorner$
  1281.     branchLabel$(2) = tmpBranchLabel$
  1282.     segment(2) = tmpSegment
  1283.     handle$(2) = tmpHandle$
  1284.     bmpName$(2) = tmpBmpName$
  1285.     arrayName$(2) = tmpArrayName$
  1286.     gosub [redrawAll]
  1287.     index = 0 'necessary here
  1288.  
  1289.     goto [inputLoop]
  1290.  
  1291.  
  1292. [moveToFront]
  1293.  
  1294.     'move the selected control to the front (last item drawn)
  1295.     if index < 2 or objectCount < 2 then [inputLoop]
  1296.     if index = objectCount then gosub [redrawAll] : goto [inputLoop]
  1297.  
  1298.     tmpType$ = type$(index)
  1299.     tmpLabel$ = label$(index)
  1300.     tmpNames$ = names$(index)
  1301.     tmpXOrigin = xOrg(index)
  1302.     tmpYOrigin = yOrg(index)
  1303.     tmpWidth = width(index)
  1304.     tmpHeight = height(index)
  1305.     tmpCorner$ = corner$(index)
  1306.     tmpBranchLabel$ = branchLabel$(index)
  1307.     tmpSegment = segment(index)
  1308.     tmpHandle$ = handle$(index)
  1309.     tmpBmpName$ = bmpName$(index)
  1310.     tmpArrayName$ = arrayName$(index)
  1311.  
  1312.     for idx = index to objectCount - 1
  1313.         type$(idx) = type$(idx+1)
  1314.         label$(idx) = label$(idx+1)
  1315.         names$(idx) = names$(idx+1)
  1316.         xOrg(idx) = xOrg(idx+1)
  1317.         yOrg(idx) = yOrg(idx+1)
  1318.         width(idx) = width(idx+1)
  1319.         height(idx) = height(idx+1)
  1320.         corner$(idx) = corner$(idx+1)
  1321.         branchLabel$(idx) = branchLabel$(idx+1)
  1322.         segment(idx) = segment(idx+1)
  1323.         handle$(idx) = handle$(idx+1)
  1324.         bmpName$(idx) = bmpName$(idx+1)
  1325.         arrayName$(idx) = arrayName$(idx+1)
  1326.     next idx
  1327.  
  1328.     type$(objectCount) = tmpType$
  1329.     label$(objectCount) = tmpLabel$
  1330.     names$(objectCount) = tmpNames$
  1331.     xOrg(objectCount) = tmpXOrigin
  1332.     yOrg(objectCount) = tmpYOrigin
  1333.     width(objectCount) = tmpWidth
  1334.     height(objectCount) = tmpHeight
  1335.     corner$(objectCount) = tmpCorner$
  1336.     branchLabel$(objectCount) = tmpBranchLabel$
  1337.     segment(objectCount) = tmpSegment
  1338.     handle$(objectCount) = tmpHandle$
  1339.     bmpName$(objectCount) = tmpBmpName$
  1340.     arrayName$(objectCount) = tmpArrayName$
  1341.  
  1342.     gosub [redrawAll]
  1343.     gosub [selectDeselect]
  1344.  
  1345.     goto [inputLoop]
  1346.  
  1347.  
  1348. [deleteControl]
  1349.  
  1350.     'delete the selected control
  1351.     if index < 2 then [inputLoop]
  1352.  
  1353.     'delete graphical segments and clean up display
  1354.     print #form, "delsegment "; selectId -1 ;
  1355.     gosub [selectDeselect]
  1356.     print #form, "delsegment "; selectId - 1 ;
  1357.  
  1358.     for idx = index to objectCount
  1359.         type$(idx) = type$(idx+1)
  1360.         label$(idx) = label$(idx+1)
  1361.         names$(idx) = names$(idx+1)
  1362.         xOrg(idx) = xOrg(idx+1)
  1363.         yOrg(idx) = yOrg(idx+1)
  1364.         width(idx) = width(idx+1)
  1365.         height(idx) = height(idx+1)
  1366.         corner$(idx) = corner$(idx+1)
  1367.         branchLabel$(idx) = branchLabel$(idx+1)
  1368.         segment(idx) = segment(idx+1)
  1369.         handle$(idx) = handle$(idx+1)
  1370.         bmpName$(idx) = bmpName$(idx+1)
  1371.         arrayName$(idx) = arrayName$(idx+1)
  1372.     next idx
  1373.  
  1374.     objectCount = objectCount - 1
  1375.  
  1376.     gosub [redrawAll]
  1377.     index = 0
  1378.  
  1379.     goto [inputLoop]
  1380.  
  1381.  
  1382. [produceCodeAndOutline]
  1383.  
  1384.     'set a flag so that an outline will be added
  1385.     produceOutline = 1
  1386.  
  1387. [produceCode]
  1388.  
  1389.     'produce code for the controls in the form
  1390.     if codeIsOpen = 1 then close #code : codeIsOpen = 0
  1391.     open "Free Form output window" for text as #code
  1392.     codeIsOpen = 1
  1393.     print #code, ""
  1394.     print #code, ""
  1395.     print #code, "    WindowWidth = "; windowXExtent
  1396.     print #code, "    WindowHeight = "; windowYExtent
  1397.     print #code, ""
  1398.     if left$(windowType$, 8) = "graphics" then print #code, "    nomainwin";chr$(13); ""
  1399.  
  1400.     if objectCount < 2 then [menuCode]
  1401.  
  1402.     for x = 2 to objectCount
  1403.         if type$(x) = "button" then gosub [codeForButton]
  1404.         if type$(x) = "combobox" then gosub [codeForComboBox]
  1405.         if type$(x) = "textbox" then gosub [codeForTextBox]
  1406.         if type$(x) = "listbox" then gosub [codeForListBox]
  1407.         if type$(x) = "bmpbutton" then gosub [codeForBmpButton]
  1408.         if type$(x) = "statictext" then gosub [codeForStaticText]
  1409.         if type$(x) = "radiobutton" then gosub [codeForRadioButton]
  1410.         if type$(x) = "checkbox" then gosub [codeForCheckBox]
  1411.         if type$(x) = "graphicbox" then gosub [codeForGraphicBox]
  1412.         if type$(x) = "groupbox" then gosub [codeForGroupBox]
  1413.         if type$(x) = "textedit" then gosub [codeForTextEdit]
  1414.         print #code, code$
  1415.     next x
  1416.  
  1417. [menuCode]   'write menu code
  1418.  
  1419.     if menuCount = 0 then [noMenuCode]
  1420.  
  1421.     if left$(windowType$, 6) = "dialog" then print #code, "    '*** menus are not supported in windows of type "; windowType$; " ***"
  1422.  
  1423.     for x = 0 to menuCount - 1
  1424.         print #code, "    menu "; winHandle$; ", "; qu$; menu$(x); qu$;
  1425.         if menuItemCount(x) = 0 then print #code, ", "; chr$(34); "&FixMe"; chr$(34); ", [fixMe]  ' <-- this menu has no items!" : goto [produceNextMenu]
  1426.         for y = 0 to menuItemCount(x) - 1
  1427.             print #code, ", ";
  1428.             mi$ = menuItem$(x, y)
  1429.             print #code, qu$; left$(mi$, instr(mi$, chr$(0)) - 1) ; qu$;
  1430.             print #code, ", "; mid$(mi$, instr(mi$, chr$(0)) + 1) ;
  1431.         next y
  1432.         print #code, ""
  1433.       [produceNextMenu]
  1434.     next x
  1435.  
  1436.  
  1437. [noMenuCode] 'don't produce menu code
  1438.  
  1439.     print #code, "    open "; qu$; windowLabel$; qu$; " for "; windowType$; " as "; winHandle$
  1440.     for idx = 1 to objectCount
  1441.         if type$(idx) = "graphicbox" then  print #code, "    print ";winHandle$;".graph, ";qu$;"fill "; boxcolor$;"; flush";qu$ 
  1442.      next idx
  1443.     if left$(windowType$, 8) = "graphics" then print #code, "    print ";winHandle$;", ";qu$;"fill "; wincolor$;"; flush";qu$
  1444.     if produceOutline = 0 then [doneProducingCode]
  1445.  
  1446. [produceOutline]
  1447.  
  1448.     inputLoopLabel$ = "[" + mid$(winHandle$, 2) + ".inputLoop]"
  1449.  
  1450.     print #code, ""
  1451.     print #code, ""
  1452.     print #code, inputLoopLabel$; "   'wait here for input event"
  1453.     print #code, "    input aVar$"
  1454.     print #code, "    goto "; inputLoopLabel$
  1455.     print #code, ""
  1456.  
  1457.     produceOutline = 0
  1458.     branchLabels$ = ""
  1459.  
  1460.     if objectCount < 2 then [outlineForMenus]
  1461.  
  1462.     for x = 2 to objectCount
  1463.         if left$(trim$(branchLabel$(x)), 1) <> "[" then [nextOutlineObject]
  1464.         if instr(trim$(branchLabel$(x)), " ") > 0 then gosub [handleMultiBranchLabels] : goto [nextOutlineObject]
  1465.         if instr(branchLabels$, branchLabel$(x)) > 0 then [nextOutlineObject]
  1466.         branchLabels$ = branchLabels$ + " " + branchLabel$(x)
  1467.         print #code, ""
  1468.         print #code, ""
  1469.         print #code, branchLabel$(x); "   'Perform action for the "; type$(x); " named '"; names$(x); "'"
  1470.         print #code, ""
  1471.         print #code, "    'Insert your own code here"
  1472.         print #code, ""
  1473.         print #code, "    goto "; inputLoopLabel$
  1474.  
  1475.       [nextOutlineObject]
  1476.     next x
  1477.  
  1478. [outlineForMenus]   'produce outline code for menus
  1479.  
  1480.     if menuCount = 0 then [doneProducingCode]
  1481.  
  1482.     for x = 0 to menuCount - 1
  1483.         if menuItemCount(x) = 0 then [writeNextMenu]
  1484.         for y = 0 to menuItemCount(x) - 1
  1485.             mi$ = menuItem$(x, y)
  1486.             bl$ = mid$(mi$, instr(mi$, chr$(0)) + 1)
  1487.             if instr(branchLabels$, bl$) > 0 then [writeNextMenuItem]
  1488.             branchLabels$ = branchLabels$ + " " + bl$
  1489.             print #code, ""
  1490.             print #code, ""
  1491.             print #code, bl$; "   'Perform action for menu "; menu$(x); ", item "; left$(mi$, instr(mi$, chr$(0)) - 1)
  1492.             print #code, ""
  1493.             print #code, "    'Insert your own code here"
  1494.           [writeNextMenuItem]
  1495.         next y
  1496.       [writeNextMenu]
  1497.     next x
  1498.  
  1499.  
  1500. [doneProducingCode]
  1501.  
  1502.     notice "Done.  Copy this code into your program."
  1503.  
  1504.     goto [inputLoop]
  1505.  
  1506.  
  1507. [handleMultiBranchLabels]   'handle the case where a control has more than 1 branching option
  1508.  
  1509.     if instr(branchLabels$, word$(branchLabel$(x), 1)) > 0 then [nextMultiBranchLabel]
  1510.     print #code, ""
  1511.     print #code, ""
  1512.     print #code, word$(branchLabel$(x), 1); "   'Perform action for the "; type$(x); " named '"; names$(x); "'"
  1513.     print #code, ""
  1514.     print #code, "    'Insert your own code here"
  1515.     print #code, ""
  1516.     print #code, "    goto "; inputLoopLabel$
  1517.  
  1518.     branchLabels$ = branchLabels$ + " " + word$(branchLabel$(x), 1)
  1519.  
  1520.   [nextMultiBranchLabel]
  1521.  
  1522.     if instr(branchLabels$, word$(branchLabel$(x), 2)) > 0 then [doneMultiBranchLabel]
  1523.     print #code, ""
  1524.     print #code, ""
  1525.     print #code, word$(branchLabel$(x), 2); "   'Perform action for the "; type$(x); " named '"; names$(x); "'"
  1526.     print #code, ""
  1527.     print #code, "    'Insert your own code here"
  1528.     print #code, ""
  1529.     print #code, "    goto "; inputLoopLabel$
  1530.     branchLabels$ = branchLabels$ + " " + word$(branchLabel$(x), 2)
  1531.  
  1532.   [doneMultiBranchLabel]
  1533.  
  1534.     return
  1535.  
  1536.  
  1537. [codeForButton]
  1538.  
  1539.     'produce code for a text button
  1540.     code$ = "    button "+winHandle$+"."+names$(x)+", "+qu$+label$(x)+qu$+", "+branchLabel$(x)+", "+corner$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1541.     return
  1542.  
  1543.  
  1544. [codeForBmpButton]
  1545.  
  1546.     'produce code for a bmp button
  1547.     code$ = "    bmpbutton "+winHandle$+"."+names$(x)+", "+qu$+bmpName$(x)+qu$+", "+branchLabel$(x)+", "+corner$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)
  1548.     return
  1549.  
  1550.  
  1551. [codeForTextBox]
  1552.  
  1553.     'produce code for a text box
  1554.     code$ = "    textbox "+winHandle$+"."+names$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1555.     return
  1556.  
  1557.  
  1558. [codeForStaticText]
  1559.  
  1560.    'produce code for a static text
  1561.     code$ = "    statictext "+winHandle$+"."+names$(x)+", "+qu$+label$(x)+qu$+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1562.     return
  1563.  
  1564.  
  1565. [codeForGroupBox]
  1566.  
  1567.     'produce code for a group box
  1568.      code$ = "    groupbox "+winHandle$+", "+qu$+label$(x)+qu$+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1569.     return
  1570.  
  1571. [codeForGraphicBox]
  1572.  
  1573.     'produce code for a graphic box
  1574.     code$ = "    graphicbox "+winHandle$+".graph, "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1575.     return
  1576.  
  1577. [codeForListBox]
  1578.  
  1579.     'produce code for a listbox
  1580.     code$ = "    listbox "+winHandle$+"."+names$(x)+", "+arrayName$(x)+", "+branchLabel$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1581.     return
  1582.  
  1583.  
  1584. [codeForComboBox]
  1585.  
  1586.     'produce code for a listbox
  1587.     code$ = "    combobox "+winHandle$+"."+names$(x)+", "+arrayName$(x)+", "+branchLabel$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1588.     return
  1589.  
  1590.  
  1591. [codeForRadioButton]
  1592.  
  1593.     'produce code for a radiobutton
  1594.     code$ = "    radiobutton "+winHandle$+"."+names$(x)+", "+qu$+label$(x)+qu$+", "+word$(branchLabel$(x), 1)+", "+word$(branchLabel$(x), 2)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1595.     return
  1596.  
  1597.  
  1598. [codeForCheckBox]
  1599.  
  1600.     'produce code for a checkbox
  1601.     code$ = "    checkbox "+winHandle$+"."+names$(x)+", "+qu$+label$(x)+qu$+", "+word$(branchLabel$(x), 1)+", "+word$(branchLabel$(x), 2)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1602.     return
  1603.  
  1604. [codeForTextEdit]
  1605.  
  1606.     'produce code for a text edit box
  1607.     code$ = "    texteditor "+winHandle$+"."+names$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1608.     return
  1609.  
  1610.  
  1611. [newFile]
  1612.  
  1613.     'clear the contents of the form editor and start over
  1614.  
  1615.     if isModified = 1 then gosub [formIsModified]
  1616.  
  1617.     newControlNumber = 0
  1618.     windowLabel$ = "untitled"
  1619.     windowType$ = "window"
  1620.     objectCount = 0
  1621.     winHandle$ = "#main"
  1622.     windowXExtent = 550
  1623.     windowYExtent = 410
  1624.  
  1625.     gosub [clearMenuData]
  1626.     gosub [addWindowFrame]
  1627.     gosub [redrawAll]
  1628.  
  1629.     isModified = 0
  1630.  
  1631.     goto [inputLoop]
  1632.  
  1633.  
  1634. [saveFile]
  1635.  
  1636.     'abort if no controls
  1637.     if objectCount < 2 then notice "No controls.  Save aborted" : goto [inputLoop]
  1638.  
  1639.     'save the form into a *.fre file
  1640.     if formName$ = "" then formName$ = "untitled.fre"
  1641.     filedialog "Save form", "*.fre", formName$
  1642.     if formName$ = "" then [inputLoop]
  1643.  
  1644.     gosub [saveFormSubroutine]
  1645.  
  1646.     notice "Done.  File saved as " + formName$
  1647.     goto [inputLoop]
  1648.  
  1649.  
  1650. [saveFormSubroutine]   'the subroutine portion of the save routine
  1651.  
  1652.     open formName$ for output as #formOut
  1653.     print #formOut, newControlNumber
  1654.     print #formOut, windowLabel$
  1655.     print #formOut, windowType$
  1656.     print #formOut, objectCount
  1657.     print #formOut, winHandle$
  1658.     print #formOut, snapOn
  1659.     print #formOut, xInterval
  1660.     print #formOut, yInterval
  1661.     print #formOut, menuCount
  1662.     print #formOut, windowXExtent
  1663.     print #formOut, windowYExtent
  1664.  
  1665.     for i = 2 to objectCount
  1666.         print #formOut, type$(i)
  1667.         print #formOut, label$(i)
  1668.         print #formOut, names$(i)
  1669.         print #formOut, xOrg(i)
  1670.         print #formOut, yOrg(i)
  1671.         print #formOut, width(i)
  1672.         print #formOut, height(i)
  1673.         print #formOut, corner$(i)
  1674.         print #formOut, branchLabel$(i)
  1675.         print #formOut, segment(i)
  1676.         print #formOut, handle$(i)
  1677.         print #formOut, bmpName$(i)
  1678.         print #formOut, arrayName$(i)
  1679.     next i
  1680.  
  1681.     'Now write the menu information
  1682.     if menuCount = 0 then [noMenusToSave]
  1683.  
  1684.     for i = 0 to menuCount - 1
  1685.         print #formOut, menu$(i)
  1686.         print #formOut, menuItemCount(i)
  1687.         if menuItemCount(i) = 0 then [noMenuItemsToSave]
  1688.         for j = 0 to menuItemCount(i) - 1
  1689.             print #formOut, menuItem$(i, j)
  1690.         next j
  1691.       [noMenuItemsToSave]
  1692.     next i
  1693.  
  1694.  
  1695. [noMenusToSave]
  1696.  
  1697.     close #formOut
  1698.  
  1699.     return
  1700.  
  1701.  
  1702. [openFile]
  1703.  
  1704.     'load the form from a *.fre file
  1705.  
  1706.     if isModified = 1 then gosub [formIsModified]
  1707.  
  1708.     filedialog "Load form", "*.fre", formName$
  1709.     if formName$ = "" then [inputLoop]
  1710.  
  1711.     gosub [clearMenuData]
  1712.     objectCount = 0
  1713.     gosub [addWindowFrame]
  1714.  
  1715.     open formName$ for input as #formIn
  1716.     input #formIn, newControlNumber
  1717.     input #formIn, windowLabel$
  1718.     input #formIn, windowType$
  1719.     input #formIn, objectCount
  1720.     input #formIn, winHandle$
  1721.     input #formIn, snapOn
  1722.     input #formIn, xInterval
  1723.     input #formIn, yInterval
  1724.     input #formIn, menuCount
  1725.     input #formIn, windowXExtent
  1726.     input #formIn, windowYExtent
  1727.  
  1728.     width(1) = windowXExtent
  1729.     height(1) = windowYExtent
  1730.  
  1731.     for i = 2 to objectCount
  1732.         input #formIn, tmp$ : type$(i) = tmp$
  1733.         input #formIn, tmp$ : label$(i) = tmp$
  1734.         input #formIn, tmp$ : names$(i) = tmp$
  1735.         input #formIn, tmp : xOrg(i) = tmp
  1736.         input #formIn, tmp : yOrg(i) = tmp
  1737.         input #formIn, tmp : width(i) = tmp
  1738.         input #formIn, tmp : height(i) = tmp
  1739.         input #formIn, tmp$ : corner$(i) = tmp$
  1740.         input #formIn, tmp$ : branchLabel$(i) = tmp$
  1741.         input #formIn, tmp : segment(i) = tmp
  1742.         input #formIn, tmp$ : handle$(i) = tmp$
  1743.         input #formIn, tmp$ : bmpName$(i) = tmp$
  1744.         if trim$(tmp$) > "" then loadbmp tmp$, tmp$
  1745.         input #formIn, tmp$ : arrayName$(i) = tmp$
  1746.     next i
  1747.  
  1748.     if menuCount = 0 then [noMenusToRead]
  1749.  
  1750.     for i = 0 to menuCount - 1
  1751.         input #formIn, tmp$ : menu$(i)=tmp$
  1752.         input #formIn, tmp : menuItemCount(i) = tmp
  1753.         if menuItemCount(i) = 0 then [noMenuItemsToRead]
  1754.         for j = 0 to menuItemCount(i) - 1
  1755.             input #formIn, tmp$ : menuItem$(i, j) = tmp$
  1756.         next j
  1757.       [noMenuItemsToRead]
  1758.     next i
  1759.  
  1760. [noMenusToRead]
  1761.  
  1762.     close #formIn
  1763.     gosub [redrawAll]
  1764.  
  1765.     isModified = 0
  1766.  
  1767.     goto [inputLoop]
  1768.  
  1769.  
  1770.  
  1771.  
  1772. [gridDialog]  'open a dialog box for selecting & adjusting snap to grid
  1773.  
  1774.     WindowWidth = 350
  1775.     WindowHeight = 225
  1776.  
  1777.     if gridDialogIsOpen = 1 then close #gridDialog
  1778.  
  1779.     statictext #gridDialog.statictext2, "Select here whether control positions will", 26, 16, 336, 20
  1780.     statictext #gridDialog.statictext5, "automatically snap to gridded positions,", 26, 35, 320, 20
  1781.     statictext #gridDialog.statictext6, "and what the interval will be.", 26, 54, 240, 20
  1782.     checkbox #gridDialog.snapOnOff, "Snap to Grid", [snapOn], [snapOff], 26, 85, 120, 20
  1783.     statictext #gridDialog.statictext7, "X interval:", 34, 112, 70, 20
  1784.     textbox #gridDialog.xIntrvl, 111, 106, 38, 25
  1785.     statictext #gridDialog.statictext9, "Y interval:", 178, 112, 70, 20
  1786.     textbox #gridDialog.yIntrvl, 255, 106, 38, 25
  1787.     button #gridDialog, "OK", [acceptGridDialog], UL, 99, 149
  1788.     button #gridDialog, "Cancel", [cancelGridDialog], UL, 29, 149
  1789.     open "Snap to Grid" for dialog_modal as #gridDialog
  1790.     print #gridDialog, "trapclose [cancelGridDialog]"
  1791.     gridDialogIsOpen = 1
  1792.  
  1793.     if snapOn = 1 then snapOnSelected = 1 : print #gridDialog.snapOnOff, "set"
  1794.     print #gridDialog.xIntrvl, xInterval
  1795.     print #gridDialog.yIntrvl, yInterval
  1796.  
  1797.     goto [inputLoop]
  1798.  
  1799.  
  1800. [snapOn]   'Perform on action for the checkbox named 'snapOnOff'
  1801.  
  1802.     snapOnSelected = 1
  1803.     goto [inputLoop]
  1804.  
  1805.  
  1806. [snapOff]   'Perform off action for the checkbox named 'snapOnOff'
  1807.  
  1808.     snapOnSelected = 0
  1809.     goto [inputLoop]
  1810.  
  1811.  
  1812. [acceptGridDialog]
  1813.  
  1814.     snapOn = snapOnSelected
  1815.     print #gridDialog.xIntrvl, "!contents?"
  1816.     input #gridDialog.xIntrvl, xInterval
  1817.     print #gridDialog.yIntrvl, "!contents?"
  1818.     input #gridDialog.yIntrvl, yInterval
  1819.  
  1820.  
  1821. [cancelGridDialog]
  1822.  
  1823.     gridDialogIsOpen = 0
  1824.     close #gridDialog
  1825.     goto [inputLoop]
  1826.  
  1827.  
  1828. [addAMenu]    'add a new menu item
  1829.  
  1830.  
  1831.     WindowWidth = 400
  1832.     WindowHeight = 230
  1833.     listbox #newMenu.menuNames, menu$(, [inputLoop], 14, 36, 120, 120
  1834.     statictext #newMenu.statictext2, "Defined Menus", 14, 16, 104, 20
  1835.     statictext #newMenu.statictext3, "Enter new menu name here:", 150, 16, 200, 20
  1836.     textbox #newMenu.newMenuName, 150, 36, 208, 25
  1837.     button #newMenu, "Accept", [acceptNewMenu], UL, 302, 131
  1838.     button #newMenu, "Cancel", [cancelNewMenu], UL, 302, 101
  1839.     open "Add a Menu" for dialog_modal as #newMenu
  1840.     print #newMenu, "trapclose [cancelNewMenu]";
  1841.     goto [inputLoop]
  1842.  
  1843.  
  1844. [cancelNewMenu]   'Perform action for the button named 'cancelNewMenu'
  1845.  
  1846.     'close the dialog box
  1847.     close #newMenu
  1848.     goto [inputLoop]
  1849.  
  1850.  
  1851. [clearMenuData]     'reset menu data arrays and indices
  1852.  
  1853.     for x = 0 to 20
  1854.         menu$(x) = ""
  1855.         for y = 0 to 30
  1856.             menuItem$(x, y) = ""
  1857.         next y
  1858.     next x
  1859.     menuCount = 0
  1860.     return
  1861.  
  1862.  
  1863. [acceptNewMenu]   'Perform action for the button named 'acceptNewMenu'
  1864.  
  1865.     'add this menu onto the list of menus, and update the display as needed
  1866.     print #newMenu.newMenuName, "!contents?";
  1867.     input #newMenu.newMenuName, result$
  1868.     if result$ = "" then notice "Please type a name for a new menu." : goto [inputLoop]
  1869.     close #newMenu
  1870.     menu$(menuCount) = result$
  1871.     menuCount = menuCount + 1
  1872.     if menuCount > 1 then gosub [redrawAll] : goto [inputLoop]
  1873.  
  1874.     'since this is the first menu added, reposition all controls 20 pixels down
  1875.     if objectCount < 2 then gosub [redrawAll] : goto [inputLoop]
  1876.     for x = 2 to objectCount
  1877.         yOrg(x) = yOrg(x) + 20
  1878.     next x
  1879.     gosub [redrawAll]
  1880.     goto [inputLoop]
  1881.  
  1882.  
  1883.  
  1884. [removeMenu]   'remove a menu from the list of menus
  1885.  
  1886.     if menuCount = 0 then notice "No menus to remove." : goto [inputLoop]
  1887.  
  1888.     if removeMenuIsOpen = 1 then close #removeMenu
  1889.  
  1890.     WindowWidth = 330
  1891.     WindowHeight = 195
  1892.     statictext #removeMenu.statictext1, "Select a menu to remove:", 26, 16, 192, 20
  1893.     listbox #removeMenu.menusToRemove, menu$(, [acceptRemoveMenu], 22, 41, 208, 100
  1894.     button #removeMenu, "Accept", [acceptRemoveMenu], UL, 246, 81
  1895.     button #removeMenu, "Cancel", [cancelRemoveMenu], UL, 246, 111
  1896.     open "Remove a Menu" for dialog_modal as #removeMenu
  1897.     print #removeMenu, "trapclose [cancelRemoveMenu]";
  1898.     removeMenuIsOpen = 1
  1899.  
  1900.     goto [inputLoop]
  1901.  
  1902.  
  1903. [acceptRemoveMenu]   'get the name of the selected item, and remove it
  1904.  
  1905.     print #removeMenu.menusToRemove, "selectionIndex?"
  1906.     input #removeMenu.menusToRemove, result
  1907.     close #removeMenu
  1908.     removeMenuIsOpen = 0
  1909.     if result = 0 then notice "No item selected.  Menu not removed." : goto [inputLoop]
  1910.  
  1911.     menuCount = menuCount - 1
  1912.     result = result - 1
  1913.  
  1914.     if result = menuCount then menu$(result) = "" : goto [checkForEmptyMenuBar]
  1915.  
  1916.     for x = result to menuCount
  1917.         menu$(x) = menu$(x+1)
  1918.     next x
  1919.  
  1920.   [checkForEmptyMenuBar]  'if there are no more menus, shift controls up 20 pixels
  1921.  
  1922.     if menuCount > 0 then gosub [redrawAll] : goto [inputLoop]
  1923.  
  1924.     for x = 2 to objectCount
  1925.         yOrg(x) = yOrg(x) - 20
  1926.     next x
  1927.  
  1928.     gosub [redrawAll]
  1929.  
  1930.     goto [inputLoop]
  1931.  
  1932.  
  1933. [cancelRemoveMenu]   'close the remove menu dialog
  1934.  
  1935.     close #removeMenu
  1936.     removeMenuIsOpen = 0
  1937.     goto [inputLoop]
  1938.  
  1939.  
  1940. [editMenus]     'edit menu order and menu contents
  1941.  
  1942.     if menuCount = 0 then notice "No menus to edit." : goto [inputLoop]
  1943.  
  1944.     if editMenuIsOpen = 1 then close #editMenu
  1945.  
  1946.     WindowWidth = 450
  1947.     WindowHeight = 375
  1948.  
  1949.     listbox #editMenu.menuList, menu$(, [selectMenuToEdit], 14, 31, 112, 105
  1950.     listbox #editMenu.menuItems, menuItemLocal$(, [selectMenuItemToEdit], 14, 166, 288, 145
  1951.     statictext #editMenu.statictext6, "Menus:", 14, 11, 48, 20
  1952.     statictext #editMenu.statictext14, "Menu line items -> Branch labels:", 14, 146, 240, 20
  1953.     button #editMenu, "&Close", [closeMenuEdit], UL, 326, 21
  1954.     button #editMenu, "&New Item", [addNewMenuItem], UL, 310, 166
  1955.     button #editMenu, "&Edit", [editMenuItem], UL, 310, 196
  1956.     button #editMenu, "Move &Up", [moveMenuItemUp], UL, 310, 226
  1957.     button #editMenu, "&Move Dn", [moveMenuItemDown], UL, 310, 256
  1958.     button #editMenu, "&Delete", [deleteMenuItem], UL, 310, 286
  1959.     button #editMenu, "&To Top", [moveMenuToTop], UL, 134, 41
  1960.     open "Edit Menus" for dialog_modal as #editMenu
  1961.     print #editMenu, "trapclose [closeMenuEdit]";
  1962.     print #editMenu.menuList, "singleclickselect";
  1963.     print #editMenu.menuItems, "singleclickselect";
  1964.  
  1965.     editMenuIsOpen = 1
  1966.     menuItemIndex = 0
  1967.     result = 0
  1968.  
  1969.     goto [inputLoop]
  1970.  
  1971.  
  1972. [selectMenuToEdit]   'Perform action for the listbox named 'menuList'
  1973.  
  1974.     'populate the listbox named menuItems
  1975.     print #editMenu.menuList, "selectionIndex?"
  1976.     input #editMenu.menuList, result
  1977.  
  1978.     for x = 0 to 29
  1979.         mil$ = menuItem$(result - 1, x)
  1980.         if mil$ <> "" then mil$ = left$(mil$, instr(mil$, chr$(0)) - 1) + " -> " + mid$(mil$, instr(mil$, chr$(0)) + 1)
  1981.         menuItemLocal$(x) = mil$
  1982.     next x
  1983.     print #editMenu.menuItems, "reload"
  1984.  
  1985.     menuItemIndex = 0
  1986.  
  1987.     goto [inputLoop]
  1988.  
  1989.  
  1990. [moveMenuToTop]   'move the selected menu to the top of the list
  1991.  
  1992.     'if there is no selection, or if the selected item is already on top, do nothing
  1993.     if result = 0 or result = 1 then [inputLoop]
  1994.  
  1995.     menu$(20) = menu$(result - 1)
  1996.     for x = 0 to 29
  1997.         menuItem$(20, x) = menuItem$(result - 1, x)
  1998.     next x
  1999.  
  2000.     for x = result - 1 to 1 step -1
  2001.         menu$(x) = menu$(x - 1)
  2002.         for y = 0 to 29
  2003.             menuItem$(x, y) = menuItem$(x - 1, y)
  2004.         next y
  2005.     next x
  2006.  
  2007.     menu$(0) = menu$(20)
  2008.     menu$(20) = ""
  2009.     for x = 0 to 29
  2010.         menuItem$(0, x) = menuItem$(20, x)
  2011.         menuItem$(20, x) = ""
  2012.     next x
  2013.  
  2014.     print #editMenu.menuList, "reload"
  2015.     print #editMenu.menuList, "selectIndex 1"
  2016.     result = 1
  2017.  
  2018.     'now continue on to the next routine!
  2019.  
  2020.  
  2021. [selectMenuItemToEdit]   'Perform action for the listbox named 'menuItems'
  2022.  
  2023.     'set the selection index for the menu item to edit
  2024.     print #editMenu.menuItems, "selectionIndex?"
  2025.     input #editMenu.menuItems, menuItemIndex
  2026.     goto [inputLoop]
  2027.  
  2028.  
  2029. [addNewMenuItem]   'Perform action for the button named 'newItemButton'
  2030.  
  2031.     'Insert your own code here
  2032.     if result = 0 then [inputLoop]
  2033.  
  2034.     if editMenuItemIsOpen = 1 then gosub [closeEditMenuItem]
  2035.  
  2036.     menuItemCount(result - 1) = menuItemCount(result - 1) + 1
  2037.     menuItemIndex = menuItemCount(result - 1)
  2038.     editMenuItemAction$ = "ADD"
  2039.     goto [editMenuItemProperties]
  2040.  
  2041.  
  2042. [editMenuItem]   'Perform action for the button named 'editMenuItem'
  2043.  
  2044.     'Insert your own code here
  2045.     if menuItemIndex = 0 then [inputLoop]
  2046.  
  2047.     if editMenuItemIsOpen = 1 then gosub [closeEditMenuItem]
  2048.  
  2049.     editMenuItemAction$ = "EDIT"
  2050.     goto [editMenuItemProperties]
  2051.  
  2052.  
  2053. [moveMenuItemUp]   'Perform action for the button named 'moveMenuItemUp'
  2054.  
  2055.     'Insert your own code here
  2056.     if menuItemIndex = 1 or menuItemIndex = 0 then [inputLoop]
  2057.  
  2058.     tmpMi$ = menuItem$(result - 1, menuItemIndex - 1)
  2059.     menuItem$(result - 1, menuItemIndex - 1) = menuItem$(result - 1, menuItemIndex - 2)
  2060.     menuItem$(result - 1, menuItemIndex - 2) = tmpMi$
  2061.  
  2062.     gosub [reloadLocalMenuItems]
  2063.  
  2064.     menuItemIndex = menuItemIndex - 1
  2065.     print #editMenu.menuItems, "selectIndex "; menuItemIndex
  2066.  
  2067.     goto [inputLoop]
  2068.  
  2069.  
  2070. [moveMenuItemDown]   'Perform action for the button named 'moveMenuItemDown'
  2071.  
  2072.     'Insert your own code here
  2073.     if result = 0 then [inputLoop]
  2074.     if menuItemIndex = menuItemCount(result - 1) or menuItemIndex = 0 then [inputLoop]
  2075.  
  2076.     tmpMi$ = menuItem$(result - 1, menuItemIndex - 1)
  2077.     menuItem$(result - 1, menuItemIndex - 1) = menuItem$(result - 1, menuItemIndex)
  2078.     menuItem$(result - 1, menuItemIndex) = tmpMi$
  2079.  
  2080.     gosub [reloadLocalMenuItems]
  2081.  
  2082.     menuItemIndex = menuItemIndex + 1
  2083.     print #editMenu.menuItems, "selectIndex "; menuItemIndex
  2084.  
  2085.     goto [inputLoop]
  2086.  
  2087.  
  2088. [deleteMenuItem]   'Perform action for the button named 'deleteMenuItem'
  2089.  
  2090.     'Insert your own code here
  2091.     if result = 0 then [inputLoop]
  2092.     if menuItemCount(result - 1) = 0 or menuItemIndex = 0 then [inputLoop]
  2093.  
  2094.     for x = menuItemIndex to 30
  2095.         menuItem$(result - 1, x - 1) = menuItem$(result - 1, x)
  2096.     next x
  2097.  
  2098.     gosub [reloadLocalMenuItems]
  2099.  
  2100.     menuItemIndex = 0
  2101.  
  2102.     return
  2103.  
  2104.  
  2105. [reloadLocalMenuItems]  'reload the contents of the menu items listbox
  2106.  
  2107.     for x = 0 to 29
  2108.         mil$ = menuItem$(result - 1, x)
  2109.         if mil$ <> "" then mil$ = left$(mil$, instr(mil$, chr$(0)) - 1) + " -> " + mid$(mil$, instr(mil$, chr$(0)) + 1)
  2110.         menuItemLocal$(x) = mil$
  2111.     next x
  2112.     print #editMenu.menuItems, "reload"
  2113.  
  2114.     return
  2115.  
  2116.  
  2117. [closeMenuEdit]   'Perform action for the button named 'closeMenuEdit'
  2118.  
  2119.     'close the menu editing dialog and redraw the form
  2120.     for x = 0 to 29 : menuItemLocal$(x) = "" : next x
  2121.     close #editMenu
  2122.     editMenuIsOpen = 0
  2123.     'gosub [redrawAll]
  2124.  
  2125.     goto [inputLoop]
  2126.  
  2127.  
  2128. [editMenuItemProperties]    'open a dialog for editing menu item properties
  2129.  
  2130.  
  2131.     WindowWidth = 350
  2132.     WindowHeight = 150
  2133.  
  2134.     textbox #menuItems.name, 134, 16, 184, 25
  2135.     textbox #menuItems.branchLabel, 134, 51, 184, 25
  2136.     statictext #menuItems.statictext6, "Name:", 22, 21, 40, 20
  2137.     statictext #menuItems.statictext7, "Branch Label:", 22, 56, 104, 20
  2138.     button #menuItems, "Accept", [acceptMenuItemProps], UL, 198, 86
  2139.     button #menuItems, "Cancel", [cancelMenuItemProps], UL, 262, 86
  2140.     open "Menu Item Properties" for dialog_modal as #menuItems
  2141.     editMenuItemIsOpen = 1
  2142.  
  2143.     print #menuItems.name, "???"
  2144.     print #menuItems.branchLabel, "[???]"
  2145.  
  2146.     if menuItem$(result - 1, menuItemIndex - 1) = "" then [inputLoop]
  2147.  
  2148.     mi$ = menuItem$(result - 1, menuItemIndex - 1)
  2149.     print #menuItems.name, left$(mi$, instr(mi$, chr$(0)) - 1)
  2150.     print #menuItems.branchLabel, mid$(mi$, instr(mi$, chr$(0)) + 1)
  2151.  
  2152.     goto [inputLoop]
  2153.  
  2154.  
  2155. [acceptMenuItemProps]   'Perform action for the button named 'acceptMenuItemProps'
  2156.  
  2157.     'accept the edited menu item
  2158.     print #menuItems.name, "!contents?";
  2159.     input #menuItems.name, nResult$
  2160.     print #menuItems.branchLabel, "!contents?";
  2161.     input #menuItems.branchLabel, blResult$
  2162.  
  2163.     if nResult$ = "" or blResult$ = "" then notice "Bad menu item properties." : goto [inputLoop]
  2164.  
  2165.     blr$ = blResult$
  2166.     if left$(blResult$, 1) <> "[" then blResult$ = "[" + blResult$
  2167.     if right$(blResult$, 1) <> "]" then blResult$ = blResult$ + "]"
  2168.  
  2169.     if blr$ <> blResult$ then notice "Branch Label was " + blr$ + ", defaulting to " + blResult$
  2170.  
  2171.     menuItem$(result - 1, menuItemIndex - 1) = nResult$ + chr$(0) + blResult$
  2172.     menuItemLocal$(menuItemIndex - 1) = nResult$ + " -> " + blResult$
  2173.  
  2174.     close #menuItems
  2175.     editMenuItemIsOpen = 0
  2176.  
  2177.     print #editMenu.menuItems, "reload"
  2178.  
  2179.     goto [inputLoop]
  2180.  
  2181.  
  2182. [cancelMenuItemProps]   'Perform action for the button named 'cancelMenuItemProps'
  2183.  
  2184.     'close the window
  2185.     gosub [closeEditMenuItem]
  2186.     goto [inputLoop]
  2187.  
  2188.  
  2189. [closeEditMenuItem]   'close the window before opening it again
  2190.  
  2191.     'close the window
  2192.     close #menuItems
  2193.     if editMenuItemAction$ = "ADD" then menuItemCount(result - 1) = menuItemCount(result - 1) - 1
  2194.     editMenuItemIsOpen = 0
  2195.     return
  2196.  
  2197.  
  2198. [formIsModified]    'the form has been modified, offer to save
  2199.  
  2200.     isModified = 0 ' set the isModified flag to be 0
  2201.     if objectCount < 2 then return  ' if there are no objects, don't offer to save form
  2202.     confirm "Save changes to " + formName$ + "?"; answer$
  2203.     if answer$ = "yes" then gosub [saveFormSubroutine]
  2204.  
  2205.     return
  2206.  
  2207.  
  2208. [settingsDialog]    'edit the settings for FreeForm
  2209.  
  2210.     WindowWidth = 336
  2211.     WindowHeight = 200
  2212.  
  2213.     checkbox #settings.creationInspect, "Inspect each control when created", [creationInspectSet], [creationInspectClear], 22, 16, 280, 19
  2214.     checkbox #settings.displayOrdering, "Display control ordering", [displayOrderingSet], [displayOrderingReset], 22, 36, 208, 19
  2215.     checkbox #settings.displayFormat, "Screen Layout Displayed for Win95 Format", [displayFormatSet], [displayFormatReset], 22, 56, 300, 19
  2216.     button #settings, "Accept", [settingsAccept], UL, 254, 101
  2217.     button #settings, "Cancel", [settingsCancel], UL, 254, 130
  2218.     open "Settings" for dialog_modal as #settings
  2219.     print #settings, "trapclose [settingsCancel]"
  2220.  
  2221.     createInspectValue = createInspect
  2222.     if createInspect > 0 then print #settings.creationInspect, "set"
  2223.     displayOrderingValue = displayOrdering
  2224.     if displayOrdering > 0 then print #settings.displayOrdering, "set"
  2225.     displayFormatValue = displayFormat
  2226.     if displayFormat > 0 then print #settings.displayFormat, "set"
  2227.  
  2228. [settings.inputLoop]   'wait here for input event
  2229.     input aVar$
  2230.     goto [settings.inputLoop]
  2231.  
  2232.  
  2233.  
  2234. [creationInspectSet]   'set value for inspect on create
  2235.  
  2236.     createInspectValue = 1
  2237.  
  2238.     goto [settings.inputLoop]
  2239.  
  2240.  
  2241. [creationInspectClear]   'set value for no inspect on create
  2242.  
  2243.     createInspectValue = 0
  2244.  
  2245.     goto [settings.inputLoop]
  2246.  
  2247.  
  2248. [displayOrderingSet]   'set value for displaying of control ordering
  2249.  
  2250.     displayOrderingValue = 1
  2251.  
  2252.     goto [settings.inputLoop]
  2253.  
  2254.  
  2255. [displayOrderingReset]   'set value for non-displaying of control ordering
  2256.  
  2257.     displayOrderingValue = 0
  2258.  
  2259.     goto [settings.inputLoop]
  2260.  
  2261. [displayFormatSet]
  2262.  
  2263.     displayFormatValue = 1
  2264.  
  2265.     goto [settings.inputLoop]
  2266.  
  2267. [displayFormatReset]
  2268.  
  2269.     displayFormatValue = 0
  2270.  
  2271.     goto [settings.inputLoop]
  2272.  
  2273.  
  2274. [settingsAccept]   'accept the settings
  2275.  
  2276.     createInspect = createInspectValue
  2277.     displayOrdering = displayOrderingValue
  2278.     displayFormat = displayFormatValue
  2279.     close #settings
  2280.     if displayFormat = 0 then loadbmp "systemBox", "bmp\systembx.bmp"
  2281.     if displayFormat = 1 and left$(windowType$, 6) = "dialog" then loadbmp "systemBox", "bmp\95sysbxd.bmp"
  2282.     if displayFormat = 1 and left$(windowType$, 6) <> "dialog" then loadbmp "systemBox", "bmp\95sysbx.bmp"
  2283.     if displayFormat = 0 then loadbmp "minBox", "bmp\minbx.bmp" else loadbmp "minBox", "bmp\95minbx.bmp"
  2284.     if displayFormat = 0 then loadbmp "maxBox", "bmp\maxbx.bmp" else loadbmp "maxBox", "bmp\95maxbx.bmp"
  2285.     if Platform$ = "Windows" and displayFormat = 0 then print #form, "font fixedsys 8 15";
  2286.     if Platform$ = "Windows" and displayFormat = 1 then print #form, "font system 7 16";
  2287.     gosub [redrawAll]
  2288.  
  2289.     goto [inputLoop]
  2290.  
  2291.  
  2292. [settingsCancel]   'discard any settings changes
  2293.  
  2294.     close #settings
  2295.  
  2296.     goto [settings.inputLoop]
  2297.  
  2298.  
  2299.  
  2300. [loadIniFile]   'load the user preferences
  2301.  
  2302.     open "fflite.ini" for input as #ini
  2303.     if eof(#ini) then close #ini : gosub [saveIniFile] : return
  2304.  
  2305.     input #ini, xInterval   'snap to x
  2306.     input #ini, yInterval   'snap to y
  2307.     input #ini, snapOn      'snap to on/off
  2308.     input #ini, createInspect 'inspect each control when created
  2309.     input #ini, displayOrdering 'display control ordering
  2310.     input #ini, displayFormat
  2311.     close #ini
  2312.  
  2313.     return
  2314.  
  2315.  
  2316. [saveIniFile]   'save the user preferences
  2317.  
  2318.     open "fflite.ini" for output as #ini
  2319.  
  2320.     print #ini, xInterval
  2321.     print #ini, yInterval
  2322.     print #ini, snapOn
  2323.     print #ini, createInspect
  2324.     print #ini, displayOrdering
  2325.     print #ini, displayFormat
  2326.  
  2327.     close #ini
  2328.  
  2329.     return
  2330.  
  2331.  
  2332. [quit]   'exit Freeform
  2333.  
  2334.     if isModified = 1 then gosub [formIsModified]
  2335.  
  2336.     'quit freeform
  2337.     confirm "Are you sure?"; answer$
  2338.     if answer$ = "no" then [inputLoop]
  2339.     gosub [saveIniFile]
  2340.     close #form
  2341.     if codeIsOpen then close #code
  2342.  
  2343. end
  2344.  
  2345.